From 7f8cd83eb9723002702fa9c67da272b38db0b548 Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Thu, 15 Jan 2026 07:31:18 +0100 Subject: [PATCH] Start on an Avalonia Ui. --- Gamenight.Ui/.gitignore | 454 +++++++ Gamenight.Ui/Directory.Packages.props | 23 + .../Gamenight.Ui.Android.csproj | 28 + Gamenight.Ui/Gamenight.Ui.Android/Icon.png | Bin 0 -> 11731 bytes .../Gamenight.Ui.Android/MainActivity.cs | 21 + .../Properties/AndroidManifest.xml | 5 + .../Resources/AboutResources.txt | 44 + .../drawable-night-v31/avalonia_anim.xml | 66 + .../Resources/drawable-v31/avalonia_anim.xml | 71 ++ .../Resources/drawable/splash_screen.xml | 13 + .../Resources/values-night/colors.xml | 4 + .../Resources/values-v31/styles.xml | 21 + .../Resources/values/colors.xml | 4 + .../Resources/values/styles.xml | 12 + .../Gamenight.Ui.Browser.csproj | 16 + Gamenight.Ui/Gamenight.Ui.Browser/Program.cs | 15 + .../Properties/AssemblyInfo.cs | 1 + .../Properties/launchSettings.json | 13 + .../runtimeconfig.template.json | 10 + .../Gamenight.Ui.Browser/wwwroot/app.css | 58 + .../Gamenight.Ui.Browser/wwwroot/favicon.ico | Bin 0 -> 175875 bytes .../Gamenight.Ui.Browser/wwwroot/index.html | 36 + .../Gamenight.Ui.Browser/wwwroot/main.js | 13 + .../Gamenight.Ui.Desktop.csproj | 26 + Gamenight.Ui/Gamenight.Ui.Desktop/Program.cs | 21 + .../Gamenight.Ui.Desktop/app.manifest | 18 + Gamenight.Ui/Gamenight.Ui.iOS/AppDelegate.cs | 23 + .../Gamenight.Ui.iOS/Entitlements.plist | 5 + .../Gamenight.Ui.iOS/Gamenight.Ui.iOS.csproj | 16 + Gamenight.Ui/Gamenight.Ui.iOS/Info.plist | 43 + Gamenight.Ui/Gamenight.Ui.iOS/Main.cs | 14 + .../Resources/LaunchScreen.xib | 43 + Gamenight.Ui/Gamenight.Ui.sln | 54 + Gamenight.Ui/Gamenight.Ui/App.axaml | 15 + Gamenight.Ui/Gamenight.Ui/App.axaml.cs | 86 ++ .../Gamenight.Ui/Assets/avalonia-logo.ico | Bin 0 -> 175875 bytes Gamenight.Ui/Gamenight.Ui/Gamenight.Ui.csproj | 27 + .../Gamenight.Ui/Services/IGamenight.cs | 1082 +++++++++++++++++ Gamenight.Ui/Gamenight.Ui/ViewLocator.cs | 37 + .../Gamenight.Ui/ViewModels/MainViewModel.cs | 28 + .../Gamenight.Ui/ViewModels/ViewModelBase.cs | 7 + .../Gamenight.Ui/Views/MainView.axaml | 16 + .../Gamenight.Ui/Views/MainView.axaml.cs | 11 + .../Gamenight.Ui/Views/MainWindow.axaml | 12 + .../Gamenight.Ui/Views/MainWindow.axaml.cs | 11 + 45 files changed, 2523 insertions(+) create mode 100644 Gamenight.Ui/.gitignore create mode 100644 Gamenight.Ui/Directory.Packages.props create mode 100644 Gamenight.Ui/Gamenight.Ui.Android/Gamenight.Ui.Android.csproj create mode 100644 Gamenight.Ui/Gamenight.Ui.Android/Icon.png create mode 100644 Gamenight.Ui/Gamenight.Ui.Android/MainActivity.cs create mode 100644 Gamenight.Ui/Gamenight.Ui.Android/Properties/AndroidManifest.xml create mode 100644 Gamenight.Ui/Gamenight.Ui.Android/Resources/AboutResources.txt create mode 100644 Gamenight.Ui/Gamenight.Ui.Android/Resources/drawable-night-v31/avalonia_anim.xml create mode 100644 Gamenight.Ui/Gamenight.Ui.Android/Resources/drawable-v31/avalonia_anim.xml create mode 100644 Gamenight.Ui/Gamenight.Ui.Android/Resources/drawable/splash_screen.xml create mode 100644 Gamenight.Ui/Gamenight.Ui.Android/Resources/values-night/colors.xml create mode 100644 Gamenight.Ui/Gamenight.Ui.Android/Resources/values-v31/styles.xml create mode 100644 Gamenight.Ui/Gamenight.Ui.Android/Resources/values/colors.xml create mode 100644 Gamenight.Ui/Gamenight.Ui.Android/Resources/values/styles.xml create mode 100644 Gamenight.Ui/Gamenight.Ui.Browser/Gamenight.Ui.Browser.csproj create mode 100644 Gamenight.Ui/Gamenight.Ui.Browser/Program.cs create mode 100644 Gamenight.Ui/Gamenight.Ui.Browser/Properties/AssemblyInfo.cs create mode 100644 Gamenight.Ui/Gamenight.Ui.Browser/Properties/launchSettings.json create mode 100644 Gamenight.Ui/Gamenight.Ui.Browser/runtimeconfig.template.json create mode 100644 Gamenight.Ui/Gamenight.Ui.Browser/wwwroot/app.css create mode 100644 Gamenight.Ui/Gamenight.Ui.Browser/wwwroot/favicon.ico create mode 100644 Gamenight.Ui/Gamenight.Ui.Browser/wwwroot/index.html create mode 100644 Gamenight.Ui/Gamenight.Ui.Browser/wwwroot/main.js create mode 100644 Gamenight.Ui/Gamenight.Ui.Desktop/Gamenight.Ui.Desktop.csproj create mode 100644 Gamenight.Ui/Gamenight.Ui.Desktop/Program.cs create mode 100644 Gamenight.Ui/Gamenight.Ui.Desktop/app.manifest create mode 100644 Gamenight.Ui/Gamenight.Ui.iOS/AppDelegate.cs create mode 100644 Gamenight.Ui/Gamenight.Ui.iOS/Entitlements.plist create mode 100644 Gamenight.Ui/Gamenight.Ui.iOS/Gamenight.Ui.iOS.csproj create mode 100644 Gamenight.Ui/Gamenight.Ui.iOS/Info.plist create mode 100644 Gamenight.Ui/Gamenight.Ui.iOS/Main.cs create mode 100644 Gamenight.Ui/Gamenight.Ui.iOS/Resources/LaunchScreen.xib create mode 100644 Gamenight.Ui/Gamenight.Ui.sln create mode 100644 Gamenight.Ui/Gamenight.Ui/App.axaml create mode 100644 Gamenight.Ui/Gamenight.Ui/App.axaml.cs create mode 100644 Gamenight.Ui/Gamenight.Ui/Assets/avalonia-logo.ico create mode 100644 Gamenight.Ui/Gamenight.Ui/Gamenight.Ui.csproj create mode 100644 Gamenight.Ui/Gamenight.Ui/Services/IGamenight.cs create mode 100644 Gamenight.Ui/Gamenight.Ui/ViewLocator.cs create mode 100644 Gamenight.Ui/Gamenight.Ui/ViewModels/MainViewModel.cs create mode 100644 Gamenight.Ui/Gamenight.Ui/ViewModels/ViewModelBase.cs create mode 100644 Gamenight.Ui/Gamenight.Ui/Views/MainView.axaml create mode 100644 Gamenight.Ui/Gamenight.Ui/Views/MainView.axaml.cs create mode 100644 Gamenight.Ui/Gamenight.Ui/Views/MainWindow.axaml create mode 100644 Gamenight.Ui/Gamenight.Ui/Views/MainWindow.axaml.cs diff --git a/Gamenight.Ui/.gitignore b/Gamenight.Ui/.gitignore new file mode 100644 index 0000000..48cc008 --- /dev/null +++ b/Gamenight.Ui/.gitignore @@ -0,0 +1,454 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# Tye +.tye/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +## +## Visual studio for Mac +## + + +# globs +Makefile.in +*.userprefs +*.usertasks +config.make +config.status +aclocal.m4 +install-sh +autom4te.cache/ +*.tar.gz +tarballs/ +test-results/ + +# Mac bundle stuff +*.dmg +*.app + +# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# JetBrains Rider +.idea/ +*.sln.iml + +## +## Visual Studio Code +## +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json diff --git a/Gamenight.Ui/Directory.Packages.props b/Gamenight.Ui/Directory.Packages.props new file mode 100644 index 0000000..76593db --- /dev/null +++ b/Gamenight.Ui/Directory.Packages.props @@ -0,0 +1,23 @@ + + + + true + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Gamenight.Ui/Gamenight.Ui.Android/Gamenight.Ui.Android.csproj b/Gamenight.Ui/Gamenight.Ui.Android/Gamenight.Ui.Android.csproj new file mode 100644 index 0000000..97a11f5 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Android/Gamenight.Ui.Android.csproj @@ -0,0 +1,28 @@ + + + Exe + net9.0-android + 21 + enable + com.CompanyName.gamenight.ui + 1 + 1.0 + apk + false + + + + + Resources\drawable\Icon.png + + + + + + + + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui.Android/Icon.png b/Gamenight.Ui/Gamenight.Ui.Android/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3c39845930eae5a98e094bdada0da2d6646bf9ce GIT binary patch literal 11731 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Lx+14BHcr{bOKYU`coMb!1@J*w6hZk(Ggg zfw4Hq-HBn{IhmIX4BXSILLy3n63Z0|it^Jkb5a#bDhpB-GLw@T7$RD?&d8qh#Eh@y z|7($I7CXjA7AhVtZ~p3UkYBy3`q(#%ocuRgPK&cVSsZPQCRhD?`|nTp;$@fSmGp1D z{5|lV_|2j%nJ<@SYO8*|xYl3pRp0sOiFHFYeJ|91$g zE`0iWUrpM&s@`Cu`M*CKJAQm_9{Hni#>wHZD2QwUPLu-!Flr{mL@_Y->^%apJZrZ7{&osXuI@x{W z#G!R#0a?~x->jV68>hZB zdFACZbC;HTEe%$ZUH|JzjBV-jJAW5$`{6h%{(rV!wZhgv$@*kZ z$w3E?o;kBxBp5~fgR-1v#x_09P#D0MVjWZp)fWF_WqAKjY|%tiBA?%2#rIg`XQ!*cn_ zO=|Oey^=O9@x1Nhl`v_cr_Qsso=4AS)^B*WicKPI*PLasU+zA7x;5{2f$E2Do~mUm zr+xf1E6N?VsW0DFllAF#n#j83lKb_nO?TdIyX7-`M^461e%Gg@ncU6X{@3RHR1#2~u($Z?)VV)) zRF^UBVO;Agp1)Th&0pmYFlE&z7rR;eY)m2)_wGtEgHIuhk2K5+3nOT z8qGpd!tQ0-4W5QQLO+tWac4MvexSgVXmnBK?}0)FrKM}M4s4owv^&IQ=Y?liyH0EN zIo{_=tGan4b@de6^+%TIY0kR*N3(*hEqh@)7dOl4bk5VN5ne1OLakr8eqQMK(C$}5 zP~MV$fu~1J19VdDwtB2RDz@XkR{k|Ei}2p4>no;CF|Bd^btP^2He0Q&@zy`?u%9~a z{dQv}U#-@v?Wb%)FC6Team8EeS?Km_6QgA}oRx@c=fALg|D+V3l%dV zP3t_>^;+mu(Yamc6c$Ix`u|Z~oqcy{$gZV9%SBsOvb$ONR3)fPc%o>(lTDvxso?Sh zJtvGa-!ApJ>H5S;luNdE!V;&C?8^>)-DJfW`skp~F8O86yA~X7yO5o1X7#6uEu<}v zZOU&ukH{x$7WhBU5(&ACz02!83)`Nk~k1AJGQMFSKI zE@YnZ6a2F1UqI=t#;tyGiq~#(M&$FZRzC4*(P_8$r<~^IF^02dP0fsD%DoX4ZpA59 z|7!tD`#ZauQsz`2o&(LFCVe}(!P0W^ch@V^3gvRb{2b2Ql*`$3*J|FryH*#j^jFwt zmn+D#otI^D$a?6qeA5Ot>4yC_GY@F=i7G{%VV$WWzPa_)B(CjSW|t&O7x%nM)LMM9 zzw5(nF_B#{3rYhQw^g6+h3< z)TzffAIJQyYB+G1djT`ovP_wfu;jyL$ES)g_etF}SD55r#b6;dVZr$Y-Ve{)uK0S9 z@9en+cH*yIxNR4ZkX>&Y$)mHW-Q>Un9_B4)KbW3dpgZ5NmTyI!z~POD+POOp?&U4X zJ@%%fFz%$K@{KjE3uj-M05R^`);ZiD~56$SdzA4lkvwazK#@y zeszY^+HEsFS}N8`r0U(uk!`+IYvom7zJ(*E?m-{(+xx$cF5W%W?PyuZ^%^mwl&8Fj zrV{rZe|f!mp4j?j<;9abH>J;eVf-g7nnBvtTd%hS zY141-YD&*tqN~kt?BJG$pNW?^TvUUMWJOvv4lT4>;B%lVfXN}qd^Tf>eZlL!x?yJT z)H&O)&AI0=Awa(Lcf`97?8TBysTLb6WVU=bswd`s&PnE2(FdMK0`}$Q(N~*UH_X17 z^Tm8q-%$nU?3^-h=`Hs!oOPDrwP#pVR(9WI^>hfOH=Gw7bLdEQ1>}W)PMvpFI$%e>%6Yygjy`2(7gD3{}Nj(c+8@7XO(t3ET#YB;TQ&*8P>_j$Q}UJ~tl<~960bn#-X&5HMO zl6xm8UodJ>iDvM;s31_mzJ;y&JLg2%qRDL+WcC#&F^%Z_^X%y+$1i zjxKZei!R*OJaLQe|Noz)xtiDx-nyY;t3Q*MXK|m|r%<- zxF^nk_kBZo@N~(JX*$xpKflI4+yB?=)8*|G{~!IhyshrP=`*HTK-i(-q_U~RS=egnAwQ%p7e`;>u75nW{zaC%p zt9$AHw-SHfK9-mM73x#}Q}S1xU~ANV`_p$T6eMq4y_2wca;CY!_r*W8``Ry69DTXd z{(ax;-TnKjUcE34e3$(_TW`+HA|KrX7$6xT54+d4B~8 z{=t+%RQ}`5`^TFPRteG$Qp{WM2Vxz60YuGTuo^fUVmnMQ|1VzwSbHAWD7a}LH-j9; zmk%({Q;g@4}n zQ7=4x_0+8!5Bv$LbD4jWBktcx& zlrDZs&o3-k^NcTBK4&|(@@qNC-|rrL+V=Ke=AUJ?FDIvIhl@1Iw+HMk-nl+n{x-Mv zV(U$O-+U*)GeO z&W_k(rOvJ*!1MY0(LEQcZ^x>gN(_BE{l}!M`nOEp3H0+PD2jh{iss*TcWRFL@4EWF zmp!%Dmz^wS{2}mLv3G6lrHkjKp0bOtYSFRYC0!hOK%e7S|EaEwg5v8Nb-g#Z{oEf@ z*5_VxH1!{k1E=D{ZuVN{%|?8y)&FUg^4o#ySI)3zSG-)fU}HJ1O~dM-z10lBWL zx4JE?z5lf)mMPRM$m%fNr&yHvyno3W)qO#dx-}Zh9S(cu^4_rZogWd%679C`N|6J% zPS)&wXD?i-Gbmqt_xNLO248`amGWx7zHcIXUzs%5IA~9MotC`K@~olht_-^g47Utp z^1XBm)BOGHg&U@sESy$g{U!WpDB}W6-{q>yZZ6p^enBeqZQ+*4rtd3E*ZVT=a^AE1 zQ}pb_X%@d%Ki|vLz`Un(vfZ)OyNj>X91u@R`mPK)6Dqd8EqoUB zxI5>Xm=Mz%3Ayew-;6`gd>6YO#+Y~F=eyW6Eza_9Q8|hmj5!pZ1-+N$+2V2EDT>v= z^~ve?hG%3pO+B%IC868ETrZdK zbb1P@Z+ygaK(6za&AApgj(2T=)f^IyUconx?fd?vC|y&9ktZ=PHTiR81sf*l{9Yb<=F|R*Q?u<73~Zy0i-i43 z)c?$>Ce2dPTDWSWMgAeB0|mRbsNXm~>3ehL5nZ3zdGcV^vAP5SY1KF6iUb1iNx z{(ROk_{QVXzAMKKXDH|9$1q(``LcwYbJuO<-3#)hs`spmdjE2r@~J<&)i$yJEnV_E zY3<54j^(nRcXseQPA;5bw=h@GFwpn2<7LGgOS0ompZxGgG_O+k-5a&TpTjGjZk_Y` zy4HmyZ;r=hr1$f^p1LFQE#s3_jJHga-`kqK{Zr8@p%eNdG~Ilw`GUV)KkP#IU1#iG zal!L^^X}}TuK30k606$H{iBt=x9>WdAM?a}qQe8P+3RHgTyuR}(DvF*>T9-YUe=Uc zSrxwES95Nc%l??~{q|SM^CjsY^3!*@-;RoMTkY-^t0M5(_IX#*DWnuw{z1&?By15qiT~PWgeYRb|{$DSG34cD!9$u!TMT>y@b6t1oGsVJKU_>hg+q1#nTqR&*Zr?QYKCl{pPg~}_LU5?^(*WmrPC*Lo$dCpR#Lal(BD~H^@h1rBueSY zQ|W1GbF4HM8My1arc0*xu8(R`SUG8%xmH5GV}P@IRo99wkN5wG`F7)iVu_$l%?Yz( zN^EmE_ATnZwX^$-$b9?j zH{)7W>OSSu&}e6*KKc6_0$=`cY91@)2iu9 zO04GJu>5tR`DqTPsmRyNP_dv5zkFJDUSiwJ7Z+Mlvj6Zb<)hJALXO`Iwm4l0v;M1B zm~;BNqGj|nQ>{}wVI8cGHs;veQoQ{xxse?02ck6VBDi z)vXIMSS+uwbC0dzt-PJnf4&X~3DVP23>RE37c_0Vcl6TtEAK9g^{@((bGHrY=k*ic z*>TVP$-zq#Lxf7XZu33gAfLF)>wUCI;!6*ykLA;48!pF*>CMQfv)XdTp6#*Y-p?7I zOWZW{rUlfBKfNFue3Df$ZTpqLV@m4{IeMmszFTT!`uFv}CGX5R_K97JU$lSK^cn{b0zkeA5N*xErQ(Gh+U1FBf>FkagFD zUHzNVlknC%Dzm03te*L&X>0zpq_W19?%umTF8r?5mtuQ%_lb7TTakCx{khIb5^>uZjcHs1|(jB&2($q8QYO3+c^P05mz?k|?w@zr^-pOAZ3`J%eXUgxRq zOWxL1GoEv|u{{hqta9E%@XtmL`{&wUCw{GbDzDCKajQ94Qt`L0knr~n>{l16@3wE3 z(3xqlcY@9BUo)Q^-tC@Xzbn0A$#?e;(Q9RV3iq{mx+Nq@zo|O>L-ORQDNollyth4l zj&+k>y(PEhzfavK>y#s|IPBY~tJx1aoPbKm5BQRYcf?gahgiA8z!`HCEc7Qu#-HfEje*lruw zJTbOtmtIz@M3+ifmP+!W6#Hl29>jdh^e|m`=Bk1i-&FZ4PbPKk^yK@tN3~pLUCn*| ze4X1W*-R_VPsGHzs_rg-UlH~HRPeD~hOv&0?wEkh&8;9^3j>bEwj zHHHtv>($*WC)cP?yjh)IzIons`2+9HY%YHO&HDS_^tlE5E9&Z^cSKxy|NQZ(ER*C- z-Zu~GMd_E;^acOC)@;*~>+dC_d47(zkm1^uqMe)G?{9I+y(IC}v-`PH+Ji<8ql-1Q zt=Ft$-!4{}R&>GfcSFYdIgh9HtbVY4){0GA5*GY@vux?CZL8TLyC!m6_>{i&!I~=_ z?e8oWTrA)G@UPE2=hI>lwhy0$m*|V6Y!ouBpCnVrXWU}8`2<$-{_Pb?Z@zHG>{|KTyeWB;Y8A9v(;n~YPLlOHs&q;$a{j{L zSpo6~RL#}|{c+iTr&`LdI_cDn*)LD7)slWD7APO|(`4o`$DaExxyzr0zTWH2*!I?K zUG6Ji`pB^E6&CyaV+&@6PG1txRoD}(^J@ip~q&IXRJIbbKvmuH*pf&Ds>Gv`dYqDJ0zR7 zaKy>StVB2bMA(F-KaKkrU)KHN*s}bql=k80y9I?a zu07v)E#hL}WrI+KQ@wIu6n=G^?&!PNdv)*bTMwj-z6suZG->9p6Bp*K+Ol&)^Ixwh zqYn+S*4F~wIkIpoGp6X&W|?`_{!!jtY1=>LarpTMNi`3crXPsd+!Rs0QTTg7u6xwv zrT-^aw-qc5X%_w$m9`{*{hek3$!7V2Lx~z+XH7r2?r37lqw<_sla+$r%G*+yo*%#T zPABKnLFL;YHp;1Qc@%%(s?zMYE2^iyloIiMo|e>TG_UPq_Jly6z3gkcH#4tL@q1=@ z=k%#Zn|!ylNfu9AKL65FSIzmyHN}72oO@Q{J@02pyV@CZcQ{*qe8xVthVkU9vcUId zuNuOcT>?s#c$6w9ZC$)X^{Zv){ygqg^Ywz0SnYrEo~mAG>#Xrdlc#_BXK9^&hY1tU zOlJ5Iraw2%&1Solod5b5@5Co2yY%elYq)>C?3(gu#a+7=nf`;#hEtbbJ2^M?L;8-Z zW@oeoV(ep&{S>UK6K>!BC?@XyWSy?Je6~ED|CSk@e(%4z#X~tIO*cRxS<>b9jVS$9 zcg?J0viMA#^Zbt`KAh>kZB4bDa-h9q;|nu^$6xxU$J{8D-mS0j(p>v>4RfH_9OZ^D z=Npn!r1TGUi{%{Ex7qyYvDP*}vHPokuuWRaofI^`|3KEY2#G}QH^qD_R+r4~JZp8= zpM938uSu~_-O8I@pUyEye%{V1H|Mn9p{?g9r1sw4e8aFe`$NIP3g@|h8(U%@TkTnT z;@(Mnfta)RH7z`jt~*eB_UfHoCtP=ZSKk}k7k%6>`BdGH;4=xmi^Wy1+*4o>xNEw| z=!@8#lC!rSE~~O}&f|FzwfJ)E?VXbYLT!`!%bxj_F3p_N-5*?ieU|8>_LbMZ?OfQV zz3lFN>ql!m!vbyOes8sixos1-rf$dVo6D|<{Jd`QB}SQJ0T@|($5Dbt5_H( z#kOBR|K*)Sa86`J`=yJ5o7%PH0<)8^^FMMobezTUe*4BlA5OUKd2n-mD4(UsiB$f> zpEsVdF`9hgeZ`DZi@Rb3c7+Gd)VrfMk$K0NR}F1fZ!S~T5UAy!xJ`JYec0^v+ihc% zSJfJo_V1i4z|~>J@cvAs9Yd}6brlhhz!@AT9ve^dJEhAnYA>lSDG(F8Ctzder|lP< z)ONHd6i#y3ntVE^zk1b-7~Y7KIU0!*cHR)?I&njF&)YZ~=G^pe=eac|d^*pvRdF`= zPbNLP?}yoMICT z)*)1xg^ZX!Gp_A`Q4wde3s`mW|oHrC^-HN zW>%`77SHokr*5n1m+g!%wg2#+sCRG?kKD=eAfCe|N~!xvPbvQ9Yp--_E= z>gv}|*3B$%XL)D!GrMuc{M_e1Xa8f)JLkIFZ3FY7GB0k9&fm2=bmOc3o=`OZzWc1I zh=5OKgM>o|Q^?I-HjG+p|MG5U2tB_vfN|BXN3x!bnpR3ea@_rHm33zl;}yEuI3*4p z6?xmic%;B@O6ekxmqJ}z`fW6{`HA(B9es@~^$Yxfy zLb95?i)w2~5X*#1b{Z4%m+ah|^C)NQukuf;3}<=IHjABny^d>YPVDr~ZpI@V?tmLU@i^%;)c-Z+Kd~m$0>X?^;s${?~&oAMSblS+?K0DE{ASlg-OS^$OYl=PXxn z*mvZQ5VKIfnnk73nQQx|aAHAr7xNR*>+2Ti%nr?Z zGOML4wSL9AQzw4&<*i>ZU+huG41NRI_b!Y(vy@5qxz=5^s~6=Ma87;kC;4p4>Z1M z4b=YTzwP6(!=-VGfeO#%AKqGCBV&F-&F<{Kmcr~RJ< z+)jl&-_}=$p#Z*HuApd z=;=|Kp37l=(N_8J$%&dXr!*?G3x_9Pmz}l5+GEMtFzv}E0#|gEEsFFaVbk+bI^hwTeH!|ONvC$?8OOz7mBDW;Y6f5P`O9ZpL7^HxqgIge?= zs;7Bp-1hKEtyr`F`o}Y@<{naAwx2^cEoXFDR+{`|JJamDAK$kN{+bh_?YP`!+J21&jN4$zhy1F&Sa7wda8z=AjGHx6U}D@-M#Ud33imaQ z6-#DcWOg#(iZtG8Fh|K^9Ye!}{gG)^`7*~8=alX?bw4XQ@|R@NITcj)RA0t(0yT zjM{LU(`kdjg|_8Z=bv`4v^+@Ivt6)z!oJrN{REnl7hY{#Y0otDA@LI*-B%$>3_;u&CE7#p)bDFUzs-pX>$LZ#U8H|c&B9g+cykUR# ze%&O67Qrb;6pv)2oU5G171A#tUZ?0$SJJgvZFkVOlkTCt0%^Vz>zmTI^JTYd%$+U2 zMojTuteKqM?5%>!1$N~de^HGWb*f;plXf~1-!>(pw*TAC^KP0>zZSo?al)jTXD;ptj9LHVlfn|0E8;p^ZiK~%Z@1Miy|zU`b8nw; zqtk`y{!VY4D()tJkNl9jPRC^ZM{j*=_eB#l?+2Lo%0HZNcuvy)Wm9V|WPI4yRp`m_ zDQ3$?g_dV8`KpW~%j|b}x2<0jYqM+Lv|y)M&Ci`?iK<>Ydrx_4>)ME*6UTpvAM(Bb z@4U(O76o6mLte!pyHfq0+s;eToMy89bGlqh|4R9DoQ_d-(k1z60 z_PnLG_FTOl&rXe$SIJ8{T^0AdbDMdfaB6Cl#LPucZl|qQ(D}R0$x^&EV4AD`S-nLY z%oFeSZksOmX#X`o9jiM{ANtk5@6=#fIOYGs&a~N;>+fwbE{y-Z-Z=KtpC8u_oZGVd z^~w+p^Hzo1ojqyta=In2{vLG<-Qc+COOGs<>bz6tD%tP5_vSsf`TOP79P_=gpFTAt zC>GuBnNr88TKu|w?c(xZ_nxlE>ipHLe)y;|tAAP2_VE2bFWg%3BQu@*UP+f0uZi~t z0g)3jCKvTx?wqo78YX8_-8B~g`+HdGm6l>bM zf8YC~yFY*Se*EU}+$k}NQ_|J1JMGswwQI}w1m}7?+qd_3@3;{g7iZR{r5UKm)n6y5=#g6E&CJ3%v48&QgbkcR zO>bliWqZsVodlj^aWMN$5D+nlKXUty0QejRpEeu}Mc z1Ef8E_?>wFG*`#}Xjc_$#t-&|McXs}{R*7l=Kr?dSKy(MmO0~X>Gw8AzS++x_L~yR zp&B;(?jf-WA5ZLhC@0upwJV6-NX}AaY3t5Y^$gD+?>Dq^^15oXGhdNs=9HhzMOn{u zS9aZ76`$KGtFqPSr2m|d-+G4SCaoTiKF2LtJ}dp?E>r&q)jRpsLI;1pI-3_et8=xF zPFVV*wO6b1R;NBSRqFrqYSY6FUga-;cX)8^`xTQd$~AG;v6CWAEB;)pjEX9~`1kHK ziHTV$nmba9!XgiCOmBU$t@qKCo4?l0+V*bG$jwVReYPVH8!Oxaa@a>pjihnknfwYWl!&IZ4VIDRwvVvXJr;Y^j! zyBf6Qd=Ec3(0B4d&YA*Q-MHY8CW}MYzfHWGd3dS$niW@ODwVt{59)9Z5D~o-Rpv4$ zab}2Nc;e5gY7Y;eITvO8NTRhNW!vA){qgU=$#qFw)vvo5;MaYK`|rjY#=^-5a>}v~ zo#Fqx&Y$CzmO}h}^DP3e;?F9tdo0)CBRc156;tRk&|+)`bkMN-5Bs9tgP%MSwyy!ndAj +{ + protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) + { + return base.CustomizeAppBuilder(builder) + .WithInterFont(); + } +} diff --git a/Gamenight.Ui/Gamenight.Ui.Android/Properties/AndroidManifest.xml b/Gamenight.Ui/Gamenight.Ui.Android/Properties/AndroidManifest.xml new file mode 100644 index 0000000..1119df6 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Android/Properties/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui.Android/Resources/AboutResources.txt b/Gamenight.Ui/Gamenight.Ui.Android/Resources/AboutResources.txt new file mode 100644 index 0000000..4cedede --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Android/Resources/AboutResources.txt @@ -0,0 +1,44 @@ +Images, layout descriptions, binary blobs and string dictionaries can be included +in your application as resource files. Various Android APIs are designed to +operate on the resource IDs instead of dealing with images, strings or binary blobs +directly. + +For example, a sample Android app that contains a user interface layout (main.axml), +an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) +would keep its resources in the "Resources" directory of the application: + +Resources/ + drawable/ + icon.png + + layout/ + main.axml + + values/ + strings.xml + +In order to get the build system to recognize Android resources, set the build action to +"AndroidResource". The native Android APIs do not operate directly with filenames, but +instead operate on resource IDs. When you compile an Android application that uses resources, +the build system will package the resources for distribution and generate a class called "R" +(this is an Android convention) that contains the tokens for each one of the resources +included. For example, for the above Resources layout, this is what the R class would expose: + +public class R { + public class drawable { + public const int icon = 0x123; + } + + public class layout { + public const int main = 0x456; + } + + public class strings { + public const int first_string = 0xabc; + public const int second_string = 0xbcd; + } +} + +You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main +to reference the layout/main.axml file, or R.strings.first_string to reference the first +string in the dictionary file values/strings.xml. \ No newline at end of file diff --git a/Gamenight.Ui/Gamenight.Ui.Android/Resources/drawable-night-v31/avalonia_anim.xml b/Gamenight.Ui/Gamenight.Ui.Android/Resources/drawable-night-v31/avalonia_anim.xml new file mode 100644 index 0000000..1fef3ac --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Android/Resources/drawable-night-v31/avalonia_anim.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui.Android/Resources/drawable-v31/avalonia_anim.xml b/Gamenight.Ui/Gamenight.Ui.Android/Resources/drawable-v31/avalonia_anim.xml new file mode 100644 index 0000000..4784f80 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Android/Resources/drawable-v31/avalonia_anim.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui.Android/Resources/drawable/splash_screen.xml b/Gamenight.Ui/Gamenight.Ui.Android/Resources/drawable/splash_screen.xml new file mode 100644 index 0000000..4cebfe2 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Android/Resources/drawable/splash_screen.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui.Android/Resources/values-night/colors.xml b/Gamenight.Ui/Gamenight.Ui.Android/Resources/values-night/colors.xml new file mode 100644 index 0000000..0f6f6c8 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Android/Resources/values-night/colors.xml @@ -0,0 +1,4 @@ + + + #212121 + diff --git a/Gamenight.Ui/Gamenight.Ui.Android/Resources/values-v31/styles.xml b/Gamenight.Ui/Gamenight.Ui.Android/Resources/values-v31/styles.xml new file mode 100644 index 0000000..8075ffa --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Android/Resources/values-v31/styles.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui.Android/Resources/values/colors.xml b/Gamenight.Ui/Gamenight.Ui.Android/Resources/values/colors.xml new file mode 100644 index 0000000..6fbae25 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Android/Resources/values/colors.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + diff --git a/Gamenight.Ui/Gamenight.Ui.Android/Resources/values/styles.xml b/Gamenight.Ui/Gamenight.Ui.Android/Resources/values/styles.xml new file mode 100644 index 0000000..77ed2d7 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Android/Resources/values/styles.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui.Browser/Gamenight.Ui.Browser.csproj b/Gamenight.Ui/Gamenight.Ui.Browser/Gamenight.Ui.Browser.csproj new file mode 100644 index 0000000..ad4048e --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Browser/Gamenight.Ui.Browser.csproj @@ -0,0 +1,16 @@ + + + net9.0-browser + Exe + true + enable + + + + + + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui.Browser/Program.cs b/Gamenight.Ui/Gamenight.Ui.Browser/Program.cs new file mode 100644 index 0000000..3d9c1ae --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Browser/Program.cs @@ -0,0 +1,15 @@ +using System.Runtime.Versioning; +using System.Threading.Tasks; +using Avalonia; +using Avalonia.Browser; +using Gamenight.Ui; + +internal sealed partial class Program +{ + private static Task Main(string[] args) => BuildAvaloniaApp() + .WithInterFont() + .StartBrowserAppAsync("out"); + + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure(); +} \ No newline at end of file diff --git a/Gamenight.Ui/Gamenight.Ui.Browser/Properties/AssemblyInfo.cs b/Gamenight.Ui/Gamenight.Ui.Browser/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..99df742 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Browser/Properties/AssemblyInfo.cs @@ -0,0 +1 @@ +[assembly:System.Runtime.Versioning.SupportedOSPlatform("browser")] diff --git a/Gamenight.Ui/Gamenight.Ui.Browser/Properties/launchSettings.json b/Gamenight.Ui/Gamenight.Ui.Browser/Properties/launchSettings.json new file mode 100644 index 0000000..243651e --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Browser/Properties/launchSettings.json @@ -0,0 +1,13 @@ +{ + "profiles": { + "Gamenight.Ui.Browser": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:7169;http://localhost:5235", + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}" + } + } +} diff --git a/Gamenight.Ui/Gamenight.Ui.Browser/runtimeconfig.template.json b/Gamenight.Ui/Gamenight.Ui.Browser/runtimeconfig.template.json new file mode 100644 index 0000000..92a0467 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Browser/runtimeconfig.template.json @@ -0,0 +1,10 @@ +{ + "wasmHostProperties": { + "perHostConfig": [ + { + "name": "browser", + "host": "browser" + } + ] + } +} \ No newline at end of file diff --git a/Gamenight.Ui/Gamenight.Ui.Browser/wwwroot/app.css b/Gamenight.Ui/Gamenight.Ui.Browser/wwwroot/app.css new file mode 100644 index 0000000..9b1f02b --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Browser/wwwroot/app.css @@ -0,0 +1,58 @@ +/* HTML styles for the splash screen */ +.avalonia-splash { + position: absolute; + height: 100%; + width: 100%; + background: white; + font-family: 'Outfit', sans-serif; + justify-content: center; + align-items: center; + display: flex; + pointer-events: none; +} + +/* Light theme styles */ +@media (prefers-color-scheme: light) { + .avalonia-splash { + background: white; + } + + .avalonia-splash h2 { + color: #1b2a4e; + } + + .avalonia-splash a { + color: #0D6EFD; + } +} + +@media (prefers-color-scheme: dark) { + .avalonia-splash { + background: #1b2a4e; + } + + .avalonia-splash h2 { + color: white; + } + + .avalonia-splash a { + color: white; + } +} + +.avalonia-splash h2 { + font-weight: 400; + font-size: 1.5rem; +} + +.avalonia-splash a { + text-decoration: none; + font-size: 2.5rem; + display: block; +} + +.avalonia-splash.splash-close { + transition: opacity 200ms, display 200ms; + display: none; + opacity: 0; +} diff --git a/Gamenight.Ui/Gamenight.Ui.Browser/wwwroot/favicon.ico b/Gamenight.Ui/Gamenight.Ui.Browser/wwwroot/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f7da8bb5863b7cecec2adcdebd948fe2f9418d0c GIT binary patch literal 175875 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 QzI@9f%@*C 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 + + + + gamenight.ui.Browser + + + + + + +
+
+

+ Powered by + + + + + + + + + + + + + + +

+
+
+ + + + diff --git a/Gamenight.Ui/Gamenight.Ui.Browser/wwwroot/main.js b/Gamenight.Ui/Gamenight.Ui.Browser/wwwroot/main.js new file mode 100644 index 0000000..2402700 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Browser/wwwroot/main.js @@ -0,0 +1,13 @@ +import { dotnet } from './_framework/dotnet.js' + +const is_browser = typeof window != "undefined"; +if (!is_browser) throw new Error(`Expected to be running in a browser`); + +const dotnetRuntime = await dotnet + .withDiagnosticTracing(false) + .withApplicationArgumentsFromQuery() + .create(); + +const config = dotnetRuntime.getConfig(); + +await dotnetRuntime.runMain(config.mainAssemblyName, [globalThis.location.href]); diff --git a/Gamenight.Ui/Gamenight.Ui.Desktop/Gamenight.Ui.Desktop.csproj b/Gamenight.Ui/Gamenight.Ui.Desktop/Gamenight.Ui.Desktop.csproj new file mode 100644 index 0000000..f358a47 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Desktop/Gamenight.Ui.Desktop.csproj @@ -0,0 +1,26 @@ + + + WinExe + + net9.0 + enable + + + + app.manifest + + + + + + + None + All + + + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui.Desktop/Program.cs b/Gamenight.Ui/Gamenight.Ui.Desktop/Program.cs new file mode 100644 index 0000000..ea4a530 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Desktop/Program.cs @@ -0,0 +1,21 @@ +using System; +using Avalonia; + +namespace Gamenight.Ui.Desktop; + +sealed class Program +{ + // Initialization code. Don't use any Avalonia, third-party APIs or any + // SynchronizationContext-reliant code before AppMain is called: things aren't initialized + // yet and stuff might break. + [STAThread] + public static void Main(string[] args) => BuildAvaloniaApp() + .StartWithClassicDesktopLifetime(args); + + // Avalonia configuration, don't remove; also used by visual designer. + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure() + .UsePlatformDetect() + .WithInterFont() + .LogToTrace(); +} diff --git a/Gamenight.Ui/Gamenight.Ui.Desktop/app.manifest b/Gamenight.Ui/Gamenight.Ui.Desktop/app.manifest new file mode 100644 index 0000000..a5bdecc --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.Desktop/app.manifest @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui.iOS/AppDelegate.cs b/Gamenight.Ui/Gamenight.Ui.iOS/AppDelegate.cs new file mode 100644 index 0000000..7ed3032 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.iOS/AppDelegate.cs @@ -0,0 +1,23 @@ +using Foundation; +using UIKit; +using Avalonia; +using Avalonia.Controls; +using Avalonia.iOS; +using Avalonia.Media; + +namespace gamenight.ui.iOS; + +// The UIApplicationDelegate for the application. This class is responsible for launching the +// User Interface of the application, as well as listening (and optionally responding) to +// application events from iOS. +[Register("AppDelegate")] +#pragma warning disable CA1711 // Identifiers should not have incorrect suffix +public partial class AppDelegate : AvaloniaAppDelegate +#pragma warning restore CA1711 // Identifiers should not have incorrect suffix +{ + protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) + { + return base.CustomizeAppBuilder(builder) + .WithInterFont(); + } +} diff --git a/Gamenight.Ui/Gamenight.Ui.iOS/Entitlements.plist b/Gamenight.Ui/Gamenight.Ui.iOS/Entitlements.plist new file mode 100644 index 0000000..c2cba09 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.iOS/Entitlements.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui.iOS/Gamenight.Ui.iOS.csproj b/Gamenight.Ui/Gamenight.Ui.iOS/Gamenight.Ui.iOS.csproj new file mode 100644 index 0000000..ef5d0dc --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.iOS/Gamenight.Ui.iOS.csproj @@ -0,0 +1,16 @@ + + + Exe + net9.0-ios + 13.0 + enable + + + + + + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui.iOS/Info.plist b/Gamenight.Ui/Gamenight.Ui.iOS/Info.plist new file mode 100644 index 0000000..5232f56 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.iOS/Info.plist @@ -0,0 +1,43 @@ + + + + + CFBundleDisplayName + gamenight.ui + CFBundleIdentifier + companyName.gamenight.ui + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + MinimumOSVersion + 13.0 + UIDeviceFamily + + 1 + 2 + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Gamenight.Ui/Gamenight.Ui.iOS/Main.cs b/Gamenight.Ui/Gamenight.Ui.iOS/Main.cs new file mode 100644 index 0000000..941b521 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.iOS/Main.cs @@ -0,0 +1,14 @@ +using UIKit; + +namespace gamenight.ui.iOS; + +public class Application +{ + // This is the main entry point of the application. + static void Main(string[] args) + { + // if you want to use a different Application Delegate class from "AppDelegate" + // you can specify it here. + UIApplication.Main(args, null, typeof(AppDelegate)); + } +} diff --git a/Gamenight.Ui/Gamenight.Ui.iOS/Resources/LaunchScreen.xib b/Gamenight.Ui/Gamenight.Ui.iOS/Resources/LaunchScreen.xib new file mode 100644 index 0000000..0be6773 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.iOS/Resources/LaunchScreen.xib @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui.sln b/Gamenight.Ui/Gamenight.Ui.sln new file mode 100644 index 0000000..765635c --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui.sln @@ -0,0 +1,54 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32811.315 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gamenight.Ui", "Gamenight.Ui\Gamenight.Ui.csproj", "{EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gamenight.Ui.Desktop", "Gamenight.Ui.Desktop\Gamenight.Ui.Desktop.csproj", "{ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gamenight.Ui.Browser", "Gamenight.Ui.Browser\Gamenight.Ui.Browser.csproj", "{1C1A049E-235C-4CD0-B6FA-D53AC418F4DA}" +EndProject +#Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gamenight.Ui.iOS", "Gamenight.Ui.iOS\Gamenight.Ui.iOS.csproj", "{EBD9022F-BC83-4846-9A11-6F7F3772DC64}" +#EndProject +#Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gamenight.Ui.Android", "Gamenight.Ui.Android\Gamenight.Ui.Android.csproj", "{7AD1DAC8-7FBE-49D5-8614-7321233DB82E}" +#EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3DA99C4E-89E3-4049-9C22-0A7EC60D83D8}" + ProjectSection(SolutionItems) = preProject + Directory.Packages.props = Directory.Packages.props + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EBFA8512-1EA5-4D8C-B4AC-AB5B48A6D568}.Release|Any CPU.Build.0 = Release|Any CPU + {ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ABC31E74-02FF-46EB-B3B2-4E6AE43B456C}.Release|Any CPU.Build.0 = Release|Any CPU + {1C1A049E-235C-4CD0-B6FA-D53AC418F4DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1C1A049E-235C-4CD0-B6FA-D53AC418F4DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1C1A049E-235C-4CD0-B6FA-D53AC418F4DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1C1A049E-235C-4CD0-B6FA-D53AC418F4DA}.Release|Any CPU.Build.0 = Release|Any CPU + {EBD9022F-BC83-4846-9A11-6F7F3772DC64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EBD9022F-BC83-4846-9A11-6F7F3772DC64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EBD9022F-BC83-4846-9A11-6F7F3772DC64}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EBD9022F-BC83-4846-9A11-6F7F3772DC64}.Release|Any CPU.Build.0 = Release|Any CPU + {7AD1DAC8-7FBE-49D5-8614-7321233DB82E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7AD1DAC8-7FBE-49D5-8614-7321233DB82E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7AD1DAC8-7FBE-49D5-8614-7321233DB82E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7AD1DAC8-7FBE-49D5-8614-7321233DB82E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {83CB65B8-011F-4ED7-BCD3-A6CFA935EF7E} + EndGlobalSection +EndGlobal diff --git a/Gamenight.Ui/Gamenight.Ui/App.axaml b/Gamenight.Ui/Gamenight.Ui/App.axaml new file mode 100644 index 0000000..1357414 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui/App.axaml @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Gamenight.Ui/Gamenight.Ui/App.axaml.cs b/Gamenight.Ui/Gamenight.Ui/App.axaml.cs new file mode 100644 index 0000000..db55439 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui/App.axaml.cs @@ -0,0 +1,86 @@ +using Avalonia; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Data.Core; +using Avalonia.Data.Core.Plugins; +using System.Linq; +using Avalonia.Markup.Xaml; +using Microsoft.Extensions.DependencyInjection; +using System; +using Refit; +using System.Runtime.Serialization; +using Gamenight.Ui.Services; +using Gamenight.Ui.ViewModels; +using Gamenight.Ui.Views; +using MainView = Gamenight.Ui.Views.MainView; +using MainViewModel = Gamenight.Ui.ViewModels.MainViewModel; +using MainWindow = Gamenight.Ui.Views.MainWindow; + +namespace Gamenight.Ui; + +public partial class App : Application +{ + private IServiceProvider? ServiceProvider; + + public override void Initialize() + { + AvaloniaXamlLoader.Load(this); + } + + public override void OnFrameworkInitializationCompleted() + { + // Register all the services needed for the application to run + var collection = new ServiceCollection(); + var gamenightApi = RestService.For("https://localhost:8080", + new RefitSettings { + ContentSerializer = new NewtonsoftJsonContentSerializer() + } + ); + collection.AddSingleton(gamenightApi); + collection.AddSingleton(); + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime) + { + collection.AddSingleton(); + } + else if (ApplicationLifetime is ISingleViewApplicationLifetime) + { + collection.AddSingleton(); + } + + ServiceProvider = collection.BuildServiceProvider(); + + var mainViewModel = ServiceProvider.GetRequiredService(); + + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + // Avoid duplicate validations from both Avalonia and the CommunityToolkit. + // More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins + DisableAvaloniaDataAnnotationValidation(); + + var window = ServiceProvider.GetRequiredService(); + + window.DataContext = mainViewModel; + desktop.MainWindow = window; + } + else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform) + { + var mainView = ServiceProvider.GetRequiredService(); + mainView.DataContext = mainViewModel; + singleViewPlatform.MainView = mainView; + } + + base.OnFrameworkInitializationCompleted(); + } + + private void DisableAvaloniaDataAnnotationValidation() + { + // Get an array of plugins to remove + var dataValidationPluginsToRemove = + BindingPlugins.DataValidators.OfType().ToArray(); + + // remove each entry found + foreach (var plugin in dataValidationPluginsToRemove) + { + BindingPlugins.DataValidators.Remove(plugin); + } + } +} \ No newline at end of file diff --git a/Gamenight.Ui/Gamenight.Ui/Assets/avalonia-logo.ico b/Gamenight.Ui/Gamenight.Ui/Assets/avalonia-logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..f7da8bb5863b7cecec2adcdebd948fe2f9418d0c GIT binary patch literal 175875 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 QzI@9f%@*C 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 + + net9.0 + enable + latest + true + + + + + + + + + + + + + None + All + + + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui/Services/IGamenight.cs b/Gamenight.Ui/Gamenight.Ui/Services/IGamenight.cs new file mode 100644 index 0000000..f4a97bf --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui/Services/IGamenight.cs @@ -0,0 +1,1082 @@ +// +// This code was generated by Refitter. +// + + +using Refit; +using System.Collections.Generic; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +#nullable enable annotations + +namespace Gamenight.Ui.Services +{ + /// Gamenight + [System.CodeDom.Compiler.GeneratedCode("Refitter", "1.7.1.0")] + public partial interface IGamenightApi + { + /// Submit your credentials to get a JWT-token to use with the rest of the api. + /// Example response + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// + [Get("/token")] + Task TokenGet([Body] Login body); + + /// Refresh your JWT-token without logging in again. + /// Example response + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// + [Post("/token")] + Task TokenPost(); + + /// List of all Users + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 400 + /// Example response + /// + /// + /// 401 + /// Example response + /// + /// + /// + [Get("/users")] + Task> Users(); + + /// Create a new user given a registration token and user information, username and email must be unique, and password and password_repeat must match. + /// A that completes when the request is finished. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Post("/user")] + Task UserPost([Body] Registration body); + + /// Get a user from primary id + /// A user in the gamenight system + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 404 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Get("/user")] + Task UserGet([Body] UserId body); + + /// Get a all gamenights + /// Retrieve the list of gamenights on this gamenight server. Requires authorization. + /// Example response + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 400 + /// Example response + /// + /// + /// 401 + /// Example response + /// + /// + /// + [Get("/gamenights")] + Task> Gamenights(); + + /// Get all participants for a gamenight + /// Retrieve the participants of a single gamenight by id. + /// Response with a list of participant uuids + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 400 + /// Example response + /// + /// + /// 401 + /// Example response + /// + /// + /// + [Get("/participants")] + Task Participants([Body] GamenightId body); + + /// Add a gamenight by providing a name and a date, only available when providing an JWT token. + /// A that completes when the request is finished. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Post("/gamenight")] + Task GamenightPost([Body] AddGamenightRequestBody body); + + /// A gamenight being hosted + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Get("/gamenight")] + Task GamenightGet([Body] GetGamenightRequestBody body); + + /// A that completes when the request is finished. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Post("/join")] + Task Join([Body] GamenightId body); + + /// A that completes when the request is finished. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Post("/leave")] + Task Leave([Body] GamenightId body); + + /// A list of Games in this gamenight instance. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Get("/games")] + Task> Games(); + + /// A game. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Get("/game")] + Task GameGet([Body] GameId body); + + /// a game id + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Post("/game")] + Task GamePost([Body] AddGameRequestBody body); + + /// A that completes when the request is finished. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Delete("/game")] + Task GameDelete([Body] GameId body); + + /// A that completes when the request is finished. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Post("/rename_game")] + Task RenameGame([Body] RenameGameRequestBody body); + + /// A that completes when the request is finished. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Post("/own")] + Task Own([Body] OwnGameRequestBody body); + + /// A that completes when the request is finished. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Post("/disown")] + Task Disown([Body] GameId body); + + /// A list of game ids. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Get("/owned_games")] + Task> OwnedGames([Body] UserId body); + + /// A location + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Get("/location")] + Task LocationGet([Body] LocationId body); + + /// A location Id + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Post("/location")] + Task LocationPost([Body] AddLocationRequestBody body); + + /// A list of all LocationsResponse + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Get("/locations")] + Task> Locations(); + + /// A that completes when the request is finished. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Post("/location_authorize")] + Task LocationAuthorize([Body] AuthorizeLocationRequestBody body); + + /// A list of user ids. + /// + /// Thrown when the request returns a non-success status code: + /// + /// + /// Status + /// Description + /// + /// + /// 401 + /// Example response + /// + /// + /// 422 + /// Example response + /// + /// + /// + [Get("/authorized_location_user_ids")] + Task> AuthorizedLocationUserIds([Body] LocationId body); + + + } + +} + +//---------------------- +// +// Generated using the NSwag toolchain v14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org) +// +//---------------------- + +#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended." +#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." +#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?' +#pragma warning disable 612 // Disable "CS0612 '...' is obsolete" +#pragma warning disable 649 // Disable "CS0649 Field is never assigned to, and will always have its default value null" +#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ... +#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..." +#pragma warning disable 8073 // Disable "CS8073 The result of the expression is always 'false' since a value of type 'T' is never equal to 'null' of type 'T?'" +#pragma warning disable 3016 // Disable "CS3016 Arrays as attribute arguments is not CLS-compliant" +#pragma warning disable 8600 // Disable "CS8600 Converting null literal or possible null value to non-nullable type" +#pragma warning disable 8602 // Disable "CS8602 Dereference of a possibly null reference" +#pragma warning disable 8603 // Disable "CS8603 Possible null reference return" +#pragma warning disable 8604 // Disable "CS8604 Possible null reference argument for parameter" +#pragma warning disable 8625 // Disable "CS8625 Cannot convert null literal to non-nullable reference type" +#pragma warning disable 8765 // Disable "CS8765 Nullability of type of parameter doesn't match overridden member (possibly because of nullability attributes)." + +namespace Gamenight.Ui.Services +{ + using System = global::System; + + + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Gamenight + { + + [JsonPropertyName("id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Id { get; set; } + + [JsonPropertyName("name")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Name { get; set; } + + [JsonPropertyName("location_id")] + public string LocationId { get; set; } + + [JsonPropertyName("datetime")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Datetime { get; set; } + + [JsonPropertyName("owner_id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string OwnerId { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Participants + { + + [JsonPropertyName("participants")] + [System.ComponentModel.DataAnnotations.Required] + public ICollection Participants1 { get; set; } = new System.Collections.ObjectModel.Collection(); + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + /// + /// Failure Reason + /// + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Failure + { + + [JsonPropertyName("message")] + public string Message { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Token + { + + [JsonPropertyName("jwt_token")] + public string JwtToken { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Login + { + + [JsonPropertyName("username")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Username { get; set; } + + [JsonPropertyName("password")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Password { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Registration + { + + [JsonPropertyName("username")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Username { get; set; } + + [JsonPropertyName("email")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Email { get; set; } + + [JsonPropertyName("password")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Password { get; set; } + + [JsonPropertyName("password_repeat")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string PasswordRepeat { get; set; } + + [JsonPropertyName("registration_token")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string RegistrationToken { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UserId + { + + [JsonPropertyName("user_id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string UserId1 { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class OwnedGame + { + + [JsonPropertyName("game_id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string GameId { get; set; } + + [JsonPropertyName("location_id")] + public string LocationId { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class LocationId + { + + [JsonPropertyName("location_id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string LocationId1 { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class AddGamenightRequestBody + { + + [JsonPropertyName("name")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Name { get; set; } + + [JsonPropertyName("datetime")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Datetime { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class GamenightId + { + + [JsonPropertyName("gamenight_id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string GamenightId1 { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class GameId + { + + [JsonPropertyName("game_id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string GameId1 { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class GetGamenightRequestBody + { + + [JsonPropertyName("id")] + public string Id { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class User + { + + [JsonPropertyName("id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Id { get; set; } + + [JsonPropertyName("username")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Username { get; set; } + + [JsonPropertyName("email")] + public string Email { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Game + { + + [JsonPropertyName("id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Id { get; set; } + + [JsonPropertyName("name")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Name { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class AddGameRequestBody + { + + [JsonPropertyName("name")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Name { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class RenameGameRequestBody + { + + [JsonPropertyName("id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Id { get; set; } + + [JsonPropertyName("name")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Name { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class OwnGameRequestBody + { + + [JsonPropertyName("game_id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string GameId { get; set; } + + [JsonPropertyName("location_id")] + public string LocationId { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class GameIdsResponse : System.Collections.ObjectModel.Collection + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class UserIdsResponse : System.Collections.ObjectModel.Collection + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class AddLocationRequestBody + { + + [JsonPropertyName("name")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Name { get; set; } + + [JsonPropertyName("address")] + public string Address { get; set; } + + [JsonPropertyName("note")] + public string Note { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class Location + { + + [JsonPropertyName("id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Id { get; set; } + + [JsonPropertyName("name")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string Name { get; set; } + + [JsonPropertyName("address")] + public string Address { get; set; } + + [JsonPropertyName("note")] + public string Note { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public partial class AuthorizeLocationRequestBody + { + + [JsonPropertyName("location_id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string LocationId { get; set; } + + [JsonPropertyName("user_id")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public string UserId { get; set; } + + [JsonPropertyName("op")] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + [JsonConverter(typeof(JsonStringEnumConverter))] + public AuthorizeLocationRequestBodyOp Op { get; set; } + + private IDictionary _additionalProperties; + + [JsonExtensionData] + public IDictionary AdditionalProperties + { + get { return _additionalProperties ?? (_additionalProperties = new Dictionary()); } + set { _additionalProperties = value; } + } + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.6.3.0 (NJsonSchema v11.5.2.0 (Newtonsoft.Json v13.0.0.0))")] + public enum AuthorizeLocationRequestBodyOp + { + + [System.Runtime.Serialization.EnumMember(Value = @"grant")] + Grant = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"revoke")] + Revoke = 1, + + } + + +} + +#pragma warning restore 108 +#pragma warning restore 114 +#pragma warning restore 472 +#pragma warning restore 612 +#pragma warning restore 649 +#pragma warning restore 1573 +#pragma warning restore 1591 +#pragma warning restore 8073 +#pragma warning restore 3016 +#pragma warning restore 8600 +#pragma warning restore 8602 +#pragma warning restore 8603 +#pragma warning restore 8604 +#pragma warning restore 8625 +#pragma warning restore 8765 \ No newline at end of file diff --git a/Gamenight.Ui/Gamenight.Ui/ViewLocator.cs b/Gamenight.Ui/Gamenight.Ui/ViewLocator.cs new file mode 100644 index 0000000..2b79fb2 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui/ViewLocator.cs @@ -0,0 +1,37 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Avalonia.Controls; +using Avalonia.Controls.Templates; +using Gamenight.Ui.ViewModels; + +namespace Gamenight.Ui; + +/// +/// Given a view model, returns the corresponding view if possible. +/// +[RequiresUnreferencedCode( + "Default implementation of ViewLocator involves reflection which may be trimmed away.", + Url = "https://docs.avaloniaui.net/docs/concepts/view-locator")] +public class ViewLocator : IDataTemplate +{ + public Control? Build(object? param) + { + if (param is null) + return null; + + var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal); + var type = Type.GetType(name); + + if (type != null) + { + return (Control)Activator.CreateInstance(type)!; + } + + return new TextBlock { Text = "Not Found: " + name }; + } + + public bool Match(object? data) + { + return data is ViewModelBase; + } +} \ No newline at end of file diff --git a/Gamenight.Ui/Gamenight.Ui/ViewModels/MainViewModel.cs b/Gamenight.Ui/Gamenight.Ui/ViewModels/MainViewModel.cs new file mode 100644 index 0000000..a0f813d --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui/ViewModels/MainViewModel.cs @@ -0,0 +1,28 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Gamenight.Ui.Services; + +namespace Gamenight.Ui.ViewModels; + +public partial class MainViewModel : ViewModelBase +{ + [ObservableProperty] + private string _greeting = "Welcome to Avalonia!"; + + private IGamenightApi GamenightApi { get; } + + public MainViewModel(IGamenightApi gamenightApi) + { + GamenightApi = gamenightApi; + + Test(); + } + + public async void Test() { + var token = await GamenightApi.TokenGet(new Login() { + Username = "Admin", + Password = "Gamenight!" + }); + + System.Console.WriteLine($"Token: {token.JwtToken}"); + } +} diff --git a/Gamenight.Ui/Gamenight.Ui/ViewModels/ViewModelBase.cs b/Gamenight.Ui/Gamenight.Ui/ViewModels/ViewModelBase.cs new file mode 100644 index 0000000..062a339 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui/ViewModels/ViewModelBase.cs @@ -0,0 +1,7 @@ +using CommunityToolkit.Mvvm.ComponentModel; + +namespace Gamenight.Ui.ViewModels; + +public abstract class ViewModelBase : ObservableObject +{ +} diff --git a/Gamenight.Ui/Gamenight.Ui/Views/MainView.axaml b/Gamenight.Ui/Gamenight.Ui/Views/MainView.axaml new file mode 100644 index 0000000..1eb7c35 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui/Views/MainView.axaml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/Gamenight.Ui/Gamenight.Ui/Views/MainView.axaml.cs b/Gamenight.Ui/Gamenight.Ui/Views/MainView.axaml.cs new file mode 100644 index 0000000..b3ec9f0 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui/Views/MainView.axaml.cs @@ -0,0 +1,11 @@ +using Avalonia.Controls; + +namespace Gamenight.Ui.Views; + +public partial class MainView : UserControl +{ + public MainView() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/Gamenight.Ui/Gamenight.Ui/Views/MainWindow.axaml b/Gamenight.Ui/Gamenight.Ui/Views/MainWindow.axaml new file mode 100644 index 0000000..bfb43e5 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui/Views/MainWindow.axaml @@ -0,0 +1,12 @@ + + + diff --git a/Gamenight.Ui/Gamenight.Ui/Views/MainWindow.axaml.cs b/Gamenight.Ui/Gamenight.Ui/Views/MainWindow.axaml.cs new file mode 100644 index 0000000..ad71430 --- /dev/null +++ b/Gamenight.Ui/Gamenight.Ui/Views/MainWindow.axaml.cs @@ -0,0 +1,11 @@ +using Avalonia.Controls; + +namespace Gamenight.Ui.Views; + +public partial class MainWindow : Window +{ + public MainWindow() + { + InitializeComponent(); + } +} \ No newline at end of file