From d62575df165b689c49c17a550fece0ad6fd3ff82 Mon Sep 17 00:00:00 2001 From: Trevor Merritt Date: Mon, 24 Aug 2026 12:41:11 -0400 Subject: [PATCH] working on web interface --- .gitignore | 3 + build.gradle.kts | 6 +- .../packages/dopewars-web/kotlin/index.html | 21 + desktop/build.gradle.kts | 14 +- .../geekback/dopewars/desktop/ClientState.kt | 3 - .../geekback/dopewars/desktop/DemoMain3.kt | 1 - .../dev/geekback/dopewars/desktop/Main.kt | 10 +- .../dev/geekback/dopewars/desktop/Main3.kt | 8 +- .../dev/geekback/dopewars/ui/TravelUi.kt | 90 - gradle.properties | 2 + gradle/libs.versions.toml | 13 +- server/build.gradle.kts | 61 +- server/docs/.swagger-codegen-ignore | 23 + server/docs/.swagger-codegen/VERSION | 1 + server/docs/index.html | 5274 +++++++++++++++++ .../dev/geekback/dopewars/server/Server.kt | 2 +- server/src/main/resources/index.html | 3 - settings.gradle.kts | 6 +- shared/build.gradle.kts | 20 +- shared_ui/build.gradle.kts | 30 + .../dev/geekback/dopewars/ui}/AppTheme.kt | 2 +- .../geekback/dopewars/ui/DopeWarsModelUi.kt | 1 - .../dev/geekback/dopewars/ui/TravelUi.kt | 85 + .../dev/geekback/dopewars/ui/api/ApiUi.kt | 0 .../dopewars/ui/api/MarketRequestUi.kt | 2 +- .../dopewars/ui/api/MarketResponseUi.kt | 2 +- .../ui/api/PlayerNameUpdateRequestUi.kt | 2 +- .../ui/api/PlayerNameUpdateResponseUi.kt | 2 +- .../dopewars/ui/api/TradeRequestUi.kt | 2 +- .../dopewars/ui/api/TravelRequestUi.kt | 2 +- .../dopewars/ui/api/TravelResponseUi.kt | 22 +- .../kotlin/dev/geekback/dopewars/ui/drug.kt | 2 - .../dev/geekback/dopewars/ui/inventory.kt | 1 - .../dev/geekback/dopewars/ui/inventoryItem.kt | 0 .../dev/geekback/dopewars/ui/location.kt | 1 - .../kotlin/dev/geekback/dopewars/ui/market.kt | 1 - .../kotlin/dev/geekback/dopewars/ui/player.kt | 3 - web/build.gradle.kts | 66 + .../processedResources/wasmJs/main/index.html | 21 + .../kotlin/dev/geekback/dopewars/web/main.kt | 24 + web/src/webMain/resources/index.html | 21 + web/src/webMain/resources/styles.css | 7 + 42 files changed, 5683 insertions(+), 177 deletions(-) create mode 100644 .gitignore create mode 100644 build/wasm/packages/dopewars-web/kotlin/index.html delete mode 100644 desktop/src/main/kotlin/dev/geekback/dopewars/ui/TravelUi.kt create mode 100644 gradle.properties create mode 100644 server/docs/.swagger-codegen-ignore create mode 100644 server/docs/.swagger-codegen/VERSION create mode 100644 server/docs/index.html delete mode 100644 server/src/main/resources/index.html create mode 100644 shared_ui/build.gradle.kts rename {desktop/src/main/kotlin/dev/geekback/dopewars/desktop => shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui}/AppTheme.kt (97%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/DopeWarsModelUi.kt (95%) create mode 100644 shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/TravelUi.kt rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/api/ApiUi.kt (100%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/api/MarketRequestUi.kt (96%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/api/MarketResponseUi.kt (93%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateRequestUi.kt (94%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateResponseUi.kt (93%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/api/TradeRequestUi.kt (96%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/api/TravelRequestUi.kt (92%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/api/TravelResponseUi.kt (83%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/drug.kt (97%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/inventory.kt (93%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/inventoryItem.kt (100%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/location.kt (96%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/market.kt (95%) rename {desktop/src/main => shared_ui/src/commonMain}/kotlin/dev/geekback/dopewars/ui/player.kt (90%) create mode 100644 web/build.gradle.kts create mode 100644 web/build/processedResources/wasmJs/main/index.html create mode 100644 web/src/webMain/kotlin/dev/geekback/dopewars/web/main.kt create mode 100644 web/src/webMain/resources/index.html create mode 100644 web/src/webMain/resources/styles.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..07bfa3b --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +build/* +**/build/* + diff --git a/build.gradle.kts b/build.gradle.kts index bad6a98..27ab617 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,11 +1,7 @@ plugins { - kotlin("multiplatform") version "2.4.10" apply false + alias(libs.plugins.kotlin.multiplatform) apply false alias(libs.plugins.compose) apply false alias(libs.plugins.kotlin.compose) apply false alias(libs.plugins.ktor) apply false alias(libs.plugins.kotlin.serialization) apply false } - -repositories { - mavenCentral() -} diff --git a/build/wasm/packages/dopewars-web/kotlin/index.html b/build/wasm/packages/dopewars-web/kotlin/index.html new file mode 100644 index 0000000..be5bedc --- /dev/null +++ b/build/wasm/packages/dopewars-web/kotlin/index.html @@ -0,0 +1,21 @@ + + + + + + KotlinProject + + + +

Web Client HTML

+ + + + + + + + + \ No newline at end of file diff --git a/desktop/build.gradle.kts b/desktop/build.gradle.kts index f696e32..358f8c6 100644 --- a/desktop/build.gradle.kts +++ b/desktop/build.gradle.kts @@ -1,5 +1,6 @@ plugins { kotlin("jvm") + // alias(libs.plugins.kotlin.jvm) alias(libs.plugins.compose) alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.serialization) @@ -7,23 +8,18 @@ plugins { dependencies { implementation(project(":shared")) - implementation("com.composables:icons-material-icons-filled-cmp:2.2.1") + implementation(project(":shared_ui")) + // implementation(libs.compose.icons.material) + // implementation("com.composables:icons-material-icons-filled-cmp:2.2.1") implementation(libs.kotlinx.serialization) - implementation(project(":shared")) implementation(libs.ktor.serialization.kotlinx.json) implementation(libs.ktor.client.core) implementation(libs.ktor.client.cio) implementation(libs.ktor.client.content.negotiation) - implementation("com.composables:icons-material-icons-filled-cmp:2.2.1") - implementation("org.jetbrains.compose.material3:material3:1.9.0") + implementation(libs.compose.material3) implementation(compose.desktop.currentOs) } -repositories { - mavenCentral() - google() -} - compose.desktop { application { mainClass = "dev.geekback.dopewars.desktop.Main3Kt" diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/ClientState.kt b/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/ClientState.kt index cae9f46..7c5854b 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/ClientState.kt +++ b/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/ClientState.kt @@ -3,11 +3,8 @@ package dev.geekback.dopewars.desktop import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue -import dev.geekback.dopewars.desktop.ApiClient import dev.geekback.dopewars.shared.Player import dev.geekback.dopewars.shared.api.TravelRequest -import dev.geekback.dopewars.shared.api.TravelResult -import dev.geekback.dopewars.ui.PlayerUi class ClientState(player: Player) { var player by mutableStateOf(player) diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/DemoMain3.kt b/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/DemoMain3.kt index afae8c3..08e7c22 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/DemoMain3.kt +++ b/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/DemoMain3.kt @@ -19,7 +19,6 @@ import androidx.compose.ui.window.Window import androidx.compose.ui.window.application import dev.geekback.dopewars.shared.Drug import dev.geekback.dopewars.shared.DrugInfo -import dev.geekback.dopewars.shared.Drugs import dev.geekback.dopewars.shared.Location import dev.geekback.dopewars.shared.Locations import dev.geekback.dopewars.shared.Market diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/Main.kt b/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/Main.kt index 8329093..dd3e447 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/Main.kt +++ b/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/Main.kt @@ -2,23 +2,15 @@ package dev.geekback.dopewars.desktop import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.Button -import androidx.compose.material3.DrawerState -import androidx.compose.material3.DrawerValue -import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.window.Window import androidx.compose.ui.window.application -import com.composables.icons.materialicons.MaterialIcons -import com.composables.icons.materialicons.filled.Menu -import dev.geekback.dopewars.shared.Drug import dev.geekback.dopewars.shared.Location import dev.geekback.dopewars.shared.Player -import kotlinx.coroutines.launch +import dev.geekback.dopewars.ui.AppTheme fun main() { diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/Main3.kt b/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/Main3.kt index 61fcfdf..6a2368b 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/Main3.kt +++ b/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/Main3.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.DrawerValue import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon import androidx.compose.material3.ModalDrawerSheet import androidx.compose.material3.ModalNavigationDrawer import androidx.compose.material3.NavigationDrawerItem @@ -22,8 +21,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Window import androidx.compose.ui.window.application -import com.composables.icons.materialicons.MaterialIcons -import com.composables.icons.materialicons.filled.Login +import dev.geekback.dopewars.ui.AppTheme import dev.geekback.dopewars.ui.PlayerUi import dev.geekback.dopewars.ui.TravelUi import kotlinx.coroutines.launch @@ -58,11 +56,13 @@ fun App() { NavigationDrawerItem( label = { Row { + /* Icon( modifier = Modifier.padding(16.dp), - imageVector = MaterialIcons.Filled.Login, + imageVector = , contentDescription = "Login Icon" ) + */ Text( modifier = Modifier.padding(16.dp), text = "Login" diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/TravelUi.kt b/desktop/src/main/kotlin/dev/geekback/dopewars/ui/TravelUi.kt deleted file mode 100644 index 368e955..0000000 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/TravelUi.kt +++ /dev/null @@ -1,90 +0,0 @@ -package dev.geekback.dopewars.ui - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.onClick -import androidx.compose.material3.Button -import androidx.compose.material3.Card -import androidx.compose.material3.DropdownMenu -import androidx.compose.material3.DropdownMenuItem -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.Window -import com.composables.icons.materialicons.MaterialIcons -import com.composables.icons.materialicons.filled.Menu -import dev.geekback.dopewars.shared.Location -import dev.geekback.dopewars.shared.Locations -import dev.geekback.dopewars.shared.Player -import dev.geekback.dopewars.shared.api.TravelRequest - -class TravelUi { - /* - Wizard - - Holds the users hand through picking a new location - */ - @Composable - fun wizard(current: Player, onTicketPunched: (TravelRequest) -> Unit) { - var stage by remember { mutableStateOf(0) } - var pickedLocation by remember { mutableStateOf(0) } - val locations = Locations.all - var expanded by remember { mutableStateOf(false) } - Window(onCloseRequest = { onTicketPunched(TravelRequest(destination = current.location)) }, title = "Select New Location") { - Card(modifier = Modifier.padding(16.dp).fillMaxSize()) { - Column { - Text("Wizard") - var index = 0; - when (stage) { - 0 -> { - Text(text = locations[pickedLocation].name) - IconButton(onClick = { expanded = !expanded }) { - Icon(MaterialIcons.Filled.Menu, contentDescription = "More options") - } - DropdownMenu( - expanded = expanded, - onDismissRequest = { expanded = false } - ) { - locations.forEach { - DropdownMenuItem( - text = { Text("$it.name / $index")}, - onClick = { - expanded = false - pickedLocation = (index - 1) - println("location index to $index") - } - ) - index += 1; - } - } - - Button(onClick = { - stage += 1 - }) { - Text("Next Step") - } - } - 1 -> { - Text("Stage 1") - Button(onClick = { - println("Selected Location - $pickedLocation") - onTicketPunched(TravelRequest(locations[pickedLocation])) - }) { - Text("Finish") - } - } - } - } - } - } - } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..257de41 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.configuration-cache=true +org.gradle.jvmargs=-Xmx12g \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 095df51..f787155 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,15 +2,19 @@ ktor = "3.5.1" kotlin = "2.4.0" compose = "1.11.1" +compose-material3 = "1.11.0-alpha07" datetime = "0.8.0" -logback = "1.5.38" +logback = "1.6.3" serialization = "1.11.0" +kotlin-wrappers = "2026.7.7" [plugins] compose = { id = "org.jetbrains.compose", version.ref="compose" } ktor = { id = "io.ktor.plugin", version.ref="ktor" } kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref="kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref="kotlin" } +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref="kotlin"} [libraries] # KotlinX Modules @@ -34,3 +38,10 @@ ktor-server-logging = { group = "io.ktor", name="ktor-server-call-logging", vers ktor-client-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktor" } ktor-client-cio = { group = "io.ktor", name = "ktor-client-cio", version.ref="ktor" } ktor-client-content-negotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref="ktor" } +# Compose Extras +compose-icons-material = { group = "com.composables", name="icons-material-icons-filled-cmp", version="2.2.1" } +compose-ui = { module = "org.jetbrains.compose.ui:ui", version.ref = "compose" } +wrappers-browser = { module = "org.jetbrains.kotlin-wrappers:kotlin-browser", version.ref = "kotlin-wrappers" } +compose-material3 = { group = "org.jetbrains.compose.material3", name = "material3", version.ref = "compose-material3" } +compose-runtime = { group = "org.jetbrains.compose.runtime", name="runtime", version.ref="compose" } +compose-foundation = { group = "org.jetbrains.compose.foundation", name="foundation", version.ref="compose"} diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 62f09e0..eb98050 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -4,9 +4,19 @@ plugins { application } -repositories { - mavenCentral() +/* + * Files supplied by the web project. + * + * This configuration is resolvable by this project but isn't itself + * published for other projects to consume. + */ +val webFiles = configurations.create("webFiles") +/* +{ + isCanBeResolved = true + isCanBeConsumed = false } +*/ dependencies { // Ktor @@ -22,7 +32,12 @@ dependencies { // Logging implementation(libs.ktor.server.logging) implementation(libs.logback) + + // Swagger/OpenAPI implementation(libs.ktor.server.swagger) + implementation(libs.ktor.server.openapi) + implementation(libs.ktor.server.routing.openapi) + implementation(libs.ktor.server.content.negotiation) // Testing testImplementation(libs.ktor.server.test.host) @@ -31,29 +46,39 @@ dependencies { // Websockets implementation(libs.ktor.server.websockets) - // Swagger/OpenAPI - implementation(libs.ktor.server.openapi) - implementation(libs.ktor.server.routing.openapi) - implementation(libs.ktor.server.content.negotiation) - // General Use implementation(libs.kotlinx.datetime) + // Shared application code implementation(project(":shared")) - implementation("ch.qos.logback:logback-classic:1.6.3") + /* + * Web application's generated files. + * + * This is a build-time dependency, not a runtime dependency. + * The web project exposes the files through its webDistribution + * outgoing configuration. + */ + webFiles(project(path = ":web", configuration = "webDistribution")) } application { mainClass = "dev.geekback.dopewars.server.ServerKt" } -// -//// Copy the JS+HTML from web to here -//tasks.processResources { -// dependsOn(":web:wasmJsBrowserProductionWebpack") -// -// from(project(":web") -// .layout -// .buildDirectory -// .dir("dist/js/productionExecutable")) -//} + +/* + * Copy the web distribution into the server's resources. + * + * The files will end up at: + * + * server/build/resources/main/web/ + * + * and therefore inside the server JAR at: + * + * web/ + */ +tasks.processResources { + from(webFiles) { + into("web") + } +} \ No newline at end of file diff --git a/server/docs/.swagger-codegen-ignore b/server/docs/.swagger-codegen-ignore new file mode 100644 index 0000000..c5fa491 --- /dev/null +++ b/server/docs/.swagger-codegen-ignore @@ -0,0 +1,23 @@ +# Swagger Codegen Ignore +# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/server/docs/.swagger-codegen/VERSION b/server/docs/.swagger-codegen/VERSION new file mode 100644 index 0000000..2680502 --- /dev/null +++ b/server/docs/.swagger-codegen/VERSION @@ -0,0 +1 @@ +3.0.81 \ No newline at end of file diff --git a/server/docs/index.html b/server/docs/index.html new file mode 100644 index 0000000..fb8312c --- /dev/null +++ b/server/docs/index.html @@ -0,0 +1,5274 @@ + + + + + Untitled API + + + + + + + + + + + + + +
+
+ +
+
+
+

Untitled API

+
+
+
+ +
+
+

Default

+
+
+
+

crudModelNameGet

+

+
+
+
+

+

+

+
+
/crud/{modelName}
+

+

Usage and SDK Samples

+

+ + +
+
+
curl -X GET\
+"//crud/{modelName}"
+
+
+
import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.DefaultApi;
+
+import java.io.File;
+import java.util.*;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        
+        DefaultApi apiInstance = new DefaultApi();
+         modelName = ; //  | 
+        try {
+            apiInstance.crudModelNameGet(modelName);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#crudModelNameGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
import io.swagger.client.api.DefaultApi;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        DefaultApi apiInstance = new DefaultApi();
+         modelName = ; //  | 
+        try {
+            apiInstance.crudModelNameGet(modelName);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#crudModelNameGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
 *modelName = ; // 
+
+DefaultApi *apiInstance = [[DefaultApi alloc] init];
+
+[apiInstance crudModelNameGetWith:modelName
+              completionHandler: ^(NSError* error) {
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+
+
+ +
+
var UntitledApi = require('untitled_api');
+
+var api = new UntitledApi.DefaultApi()
+var modelName = ; // {{}} 
+
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully.');
+  }
+};
+api.crudModelNameGet(modelName, callback);
+
+
+ + +
+
using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class crudModelNameGetExample
+    {
+        public void main()
+        {
+
+            var apiInstance = new DefaultApi();
+            var modelName = new (); //  | 
+
+            try
+            {
+                apiInstance.crudModelNameGet(modelName);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling DefaultApi.crudModelNameGet: " + e.Message );
+            }
+        }
+    }
+}
+
+
+ +
+
<?php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\ApiDefaultApi();
+$modelName = ; //  | 
+
+try {
+    $api_instance->crudModelNameGet($modelName);
+} catch (Exception $e) {
+    echo 'Exception when calling DefaultApi->crudModelNameGet: ', $e->getMessage(), PHP_EOL;
+}
+?>
+
+ +
+
use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::DefaultApi;
+
+my $api_instance = WWW::SwaggerClient::DefaultApi->new();
+my $modelName = ; #  | 
+
+eval { 
+    $api_instance->crudModelNameGet(modelName => $modelName);
+};
+if ($@) {
+    warn "Exception when calling DefaultApi->crudModelNameGet: $@\n";
+}
+
+ +
+
from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.DefaultApi()
+modelName =  #  | 
+
+try: 
+    api_instance.crud_model_name_get(modelName)
+except ApiException as e:
+    print("Exception when calling DefaultApi->crudModelNameGet: %s\n" % e)
+
+
+ +

Parameters

+ +
Path parameters
+ + + + + + + + +
NameDescription
modelName* + + +
+
+
+ + + + +
+
+ Required +
+
+
+
+ + + + + +

Responses

+
+
+
+
+
+
+

crudModelNameModelIdGet

+

+
+
+
+

+

+

+
+
/crud/{modelName}/{modelId}
+

+

Usage and SDK Samples

+

+ + +
+
+
curl -X GET\
+"//crud/{modelName}/{modelId}"
+
+
+
import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.DefaultApi;
+
+import java.io.File;
+import java.util.*;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        
+        DefaultApi apiInstance = new DefaultApi();
+         modelName = ; //  | 
+         modelId = ; //  | 
+        try {
+            apiInstance.crudModelNameModelIdGet(modelName, modelId);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#crudModelNameModelIdGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
import io.swagger.client.api.DefaultApi;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        DefaultApi apiInstance = new DefaultApi();
+         modelName = ; //  | 
+         modelId = ; //  | 
+        try {
+            apiInstance.crudModelNameModelIdGet(modelName, modelId);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#crudModelNameModelIdGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
 *modelName = ; // 
+ *modelId = ; // 
+
+DefaultApi *apiInstance = [[DefaultApi alloc] init];
+
+[apiInstance crudModelNameModelIdGetWith:modelName
+    modelId:modelId
+              completionHandler: ^(NSError* error) {
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+
+
+ +
+
var UntitledApi = require('untitled_api');
+
+var api = new UntitledApi.DefaultApi()
+var modelName = ; // {{}} 
+var modelId = ; // {{}} 
+
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully.');
+  }
+};
+api.crudModelNameModelIdGet(modelName, modelId, callback);
+
+
+ + +
+
using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class crudModelNameModelIdGetExample
+    {
+        public void main()
+        {
+
+            var apiInstance = new DefaultApi();
+            var modelName = new (); //  | 
+            var modelId = new (); //  | 
+
+            try
+            {
+                apiInstance.crudModelNameModelIdGet(modelName, modelId);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling DefaultApi.crudModelNameModelIdGet: " + e.Message );
+            }
+        }
+    }
+}
+
+
+ +
+
<?php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\ApiDefaultApi();
+$modelName = ; //  | 
+$modelId = ; //  | 
+
+try {
+    $api_instance->crudModelNameModelIdGet($modelName, $modelId);
+} catch (Exception $e) {
+    echo 'Exception when calling DefaultApi->crudModelNameModelIdGet: ', $e->getMessage(), PHP_EOL;
+}
+?>
+
+ +
+
use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::DefaultApi;
+
+my $api_instance = WWW::SwaggerClient::DefaultApi->new();
+my $modelName = ; #  | 
+my $modelId = ; #  | 
+
+eval { 
+    $api_instance->crudModelNameModelIdGet(modelName => $modelName, modelId => $modelId);
+};
+if ($@) {
+    warn "Exception when calling DefaultApi->crudModelNameModelIdGet: $@\n";
+}
+
+ +
+
from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.DefaultApi()
+modelName =  #  | 
+modelId =  #  | 
+
+try: 
+    api_instance.crud_model_name_model_id_get(modelName, modelId)
+except ApiException as e:
+    print("Exception when calling DefaultApi->crudModelNameModelIdGet: %s\n" % e)
+
+
+ +

Parameters

+ +
Path parameters
+ + + + + + + + + + + +
NameDescription
modelName* + + +
+
+
+ + + + +
+
+ Required +
+
+
+
modelId* + + +
+
+
+ + + + +
+
+ Required +
+
+
+
+ + + + + +

Responses

+
+
+
+
+
+
+

marketGet

+

+
+
+
+

+

+

+
+
/market
+

+

Usage and SDK Samples

+

+ + +
+
+
curl -X GET\
+"//market"
+
+
+
import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.DefaultApi;
+
+import java.io.File;
+import java.util.*;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        
+        DefaultApi apiInstance = new DefaultApi();
+        try {
+            apiInstance.marketGet();
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#marketGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
import io.swagger.client.api.DefaultApi;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        DefaultApi apiInstance = new DefaultApi();
+        try {
+            apiInstance.marketGet();
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#marketGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+

+DefaultApi *apiInstance = [[DefaultApi alloc] init];
+
+[apiInstance marketGetWithCompletionHandler: 
+              ^(NSError* error) {
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+
+
+ +
+
var UntitledApi = require('untitled_api');
+
+var api = new UntitledApi.DefaultApi()
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully.');
+  }
+};
+api.marketGet(callback);
+
+
+ + +
+
using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class marketGetExample
+    {
+        public void main()
+        {
+
+            var apiInstance = new DefaultApi();
+
+            try
+            {
+                apiInstance.marketGet();
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling DefaultApi.marketGet: " + e.Message );
+            }
+        }
+    }
+}
+
+
+ +
+
<?php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\ApiDefaultApi();
+
+try {
+    $api_instance->marketGet();
+} catch (Exception $e) {
+    echo 'Exception when calling DefaultApi->marketGet: ', $e->getMessage(), PHP_EOL;
+}
+?>
+
+ +
+
use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::DefaultApi;
+
+my $api_instance = WWW::SwaggerClient::DefaultApi->new();
+
+eval { 
+    $api_instance->marketGet();
+};
+if ($@) {
+    warn "Exception when calling DefaultApi->marketGet: $@\n";
+}
+
+ +
+
from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.DefaultApi()
+
+try: 
+    api_instance.market_get()
+except ApiException as e:
+    print("Exception when calling DefaultApi->marketGet: %s\n" % e)
+
+
+ +

Parameters

+ + + + + + +

Responses

+
+
+
+
+
+
+

marketPlayerIdGet

+

Get Market for Specified Player

+
+
+
+

+

Get a list of the products and the prices in a market

+

+
+
/market/{playerId}
+

+

Usage and SDK Samples

+

+ + +
+
+
curl -X GET\
+-H "Accept: application/json"\
+"//market/{playerId}"
+
+
+
import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.DefaultApi;
+
+import java.io.File;
+import java.util.*;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        
+        DefaultApi apiInstance = new DefaultApi();
+         playerId = ; //  | 
+        try {
+            MarketResult result = apiInstance.marketPlayerIdGet(playerId);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#marketPlayerIdGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
import io.swagger.client.api.DefaultApi;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        DefaultApi apiInstance = new DefaultApi();
+         playerId = ; //  | 
+        try {
+            MarketResult result = apiInstance.marketPlayerIdGet(playerId);
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#marketPlayerIdGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
 *playerId = ; // 
+
+DefaultApi *apiInstance = [[DefaultApi alloc] init];
+
+// Get Market for Specified Player
+[apiInstance marketPlayerIdGetWith:playerId
+              completionHandler: ^(MarketResult output, NSError* error) {
+                            if (output) {
+                                NSLog(@"%@", output);
+                            }
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+
+
+ +
+
var UntitledApi = require('untitled_api');
+
+var api = new UntitledApi.DefaultApi()
+var playerId = ; // {{}} 
+
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully. Returned data: ' + data);
+  }
+};
+api.marketPlayerIdGet(playerId, callback);
+
+
+ + +
+
using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class marketPlayerIdGetExample
+    {
+        public void main()
+        {
+
+            var apiInstance = new DefaultApi();
+            var playerId = new (); //  | 
+
+            try
+            {
+                // Get Market for Specified Player
+                MarketResult result = apiInstance.marketPlayerIdGet(playerId);
+                Debug.WriteLine(result);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling DefaultApi.marketPlayerIdGet: " + e.Message );
+            }
+        }
+    }
+}
+
+
+ +
+
<?php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\ApiDefaultApi();
+$playerId = ; //  | 
+
+try {
+    $result = $api_instance->marketPlayerIdGet($playerId);
+    print_r($result);
+} catch (Exception $e) {
+    echo 'Exception when calling DefaultApi->marketPlayerIdGet: ', $e->getMessage(), PHP_EOL;
+}
+?>
+
+ +
+
use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::DefaultApi;
+
+my $api_instance = WWW::SwaggerClient::DefaultApi->new();
+my $playerId = ; #  | 
+
+eval { 
+    my $result = $api_instance->marketPlayerIdGet(playerId => $playerId);
+    print Dumper($result);
+};
+if ($@) {
+    warn "Exception when calling DefaultApi->marketPlayerIdGet: $@\n";
+}
+
+ +
+
from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.DefaultApi()
+playerId =  #  | 
+
+try: 
+    # Get Market for Specified Player
+    api_response = api_instance.market_player_id_get(playerId)
+    pprint(api_response)
+except ApiException as e:
+    print("Exception when calling DefaultApi->marketPlayerIdGet: %s\n" % e)
+
+
+ +

Parameters

+ +
Path parameters
+ + + + + + + + +
NameDescription
playerId* + + +
+
+
+ + + + +
+
+ Required +
+
+
+
+ + + + + +

Responses

+

Status: 200 - Market Snapshot

+ + + +
+
+
+ +
+ +
+
+ +

Status: 400 - Invalid Query

+ + + +
+
+ +
+
+
+
+
+
+

playersGet

+

Get all Players

+
+
+
+

+

Get a list of all the players on the server

+

+
+
/players
+

+

Usage and SDK Samples

+

+ + +
+
+
curl -X GET\
+-H "Accept: application/json"\
+"//players"
+
+
+
import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.DefaultApi;
+
+import java.io.File;
+import java.util.*;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        
+        DefaultApi apiInstance = new DefaultApi();
+        try {
+            apiInstance.playersGet();
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#playersGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
import io.swagger.client.api.DefaultApi;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        DefaultApi apiInstance = new DefaultApi();
+        try {
+            apiInstance.playersGet();
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#playersGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+

+DefaultApi *apiInstance = [[DefaultApi alloc] init];
+
+// Get all Players
+[apiInstance playersGetWithCompletionHandler: 
+              ^(NSError* error) {
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+
+
+ +
+
var UntitledApi = require('untitled_api');
+
+var api = new UntitledApi.DefaultApi()
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully.');
+  }
+};
+api.playersGet(callback);
+
+
+ + +
+
using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class playersGetExample
+    {
+        public void main()
+        {
+
+            var apiInstance = new DefaultApi();
+
+            try
+            {
+                // Get all Players
+                apiInstance.playersGet();
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling DefaultApi.playersGet: " + e.Message );
+            }
+        }
+    }
+}
+
+
+ +
+
<?php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\ApiDefaultApi();
+
+try {
+    $api_instance->playersGet();
+} catch (Exception $e) {
+    echo 'Exception when calling DefaultApi->playersGet: ', $e->getMessage(), PHP_EOL;
+}
+?>
+
+ +
+
use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::DefaultApi;
+
+my $api_instance = WWW::SwaggerClient::DefaultApi->new();
+
+eval { 
+    $api_instance->playersGet();
+};
+if ($@) {
+    warn "Exception when calling DefaultApi->playersGet: $@\n";
+}
+
+ +
+
from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.DefaultApi()
+
+try: 
+    # Get all Players
+    api_instance.players_get()
+except ApiException as e:
+    print("Exception when calling DefaultApi->playersGet: %s\n" % e)
+
+
+ +

Parameters

+ + + + + + +

Responses

+

Status: 200 - A list of Users

+ + + +
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+

playersPlayerIdGet

+

+
+
+
+

+

+

+
+
/players/{playerId}
+

+

Usage and SDK Samples

+

+ + +
+
+
curl -X GET\
+"//players/{playerId}"
+
+
+
import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.DefaultApi;
+
+import java.io.File;
+import java.util.*;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        
+        DefaultApi apiInstance = new DefaultApi();
+         playerId = ; //  | 
+        try {
+            apiInstance.playersPlayerIdGet(playerId);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#playersPlayerIdGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
import io.swagger.client.api.DefaultApi;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        DefaultApi apiInstance = new DefaultApi();
+         playerId = ; //  | 
+        try {
+            apiInstance.playersPlayerIdGet(playerId);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#playersPlayerIdGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
 *playerId = ; // 
+
+DefaultApi *apiInstance = [[DefaultApi alloc] init];
+
+[apiInstance playersPlayerIdGetWith:playerId
+              completionHandler: ^(NSError* error) {
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+
+
+ +
+
var UntitledApi = require('untitled_api');
+
+var api = new UntitledApi.DefaultApi()
+var playerId = ; // {{}} 
+
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully.');
+  }
+};
+api.playersPlayerIdGet(playerId, callback);
+
+
+ + +
+
using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class playersPlayerIdGetExample
+    {
+        public void main()
+        {
+
+            var apiInstance = new DefaultApi();
+            var playerId = new (); //  | 
+
+            try
+            {
+                apiInstance.playersPlayerIdGet(playerId);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling DefaultApi.playersPlayerIdGet: " + e.Message );
+            }
+        }
+    }
+}
+
+
+ +
+
<?php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\ApiDefaultApi();
+$playerId = ; //  | 
+
+try {
+    $api_instance->playersPlayerIdGet($playerId);
+} catch (Exception $e) {
+    echo 'Exception when calling DefaultApi->playersPlayerIdGet: ', $e->getMessage(), PHP_EOL;
+}
+?>
+
+ +
+
use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::DefaultApi;
+
+my $api_instance = WWW::SwaggerClient::DefaultApi->new();
+my $playerId = ; #  | 
+
+eval { 
+    $api_instance->playersPlayerIdGet(playerId => $playerId);
+};
+if ($@) {
+    warn "Exception when calling DefaultApi->playersPlayerIdGet: $@\n";
+}
+
+ +
+
from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.DefaultApi()
+playerId =  #  | 
+
+try: 
+    api_instance.players_player_id_get(playerId)
+except ApiException as e:
+    print("Exception when calling DefaultApi->playersPlayerIdGet: %s\n" % e)
+
+
+ +

Parameters

+ +
Path parameters
+ + + + + + + + +
NameDescription
playerId* + + +
+
+
+ + + + +
+
+ Required +
+
+
+
+ + + + + +

Responses

+
+
+
+
+
+
+

playersPlayerIdRenamePost

+

+
+
+
+

+

+

+
+
/players/{playerId}/rename
+

+

Usage and SDK Samples

+

+ + +
+
+
curl -X POST\
+"//players/{playerId}/rename"
+
+
+
import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.DefaultApi;
+
+import java.io.File;
+import java.util.*;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        
+        DefaultApi apiInstance = new DefaultApi();
+         playerId = ; //  | 
+        try {
+            apiInstance.playersPlayerIdRenamePost(playerId);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#playersPlayerIdRenamePost");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
import io.swagger.client.api.DefaultApi;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        DefaultApi apiInstance = new DefaultApi();
+         playerId = ; //  | 
+        try {
+            apiInstance.playersPlayerIdRenamePost(playerId);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#playersPlayerIdRenamePost");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
 *playerId = ; // 
+
+DefaultApi *apiInstance = [[DefaultApi alloc] init];
+
+[apiInstance playersPlayerIdRenamePostWith:playerId
+              completionHandler: ^(NSError* error) {
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+
+
+ +
+
var UntitledApi = require('untitled_api');
+
+var api = new UntitledApi.DefaultApi()
+var playerId = ; // {{}} 
+
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully.');
+  }
+};
+api.playersPlayerIdRenamePost(playerId, callback);
+
+
+ + +
+
using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class playersPlayerIdRenamePostExample
+    {
+        public void main()
+        {
+
+            var apiInstance = new DefaultApi();
+            var playerId = new (); //  | 
+
+            try
+            {
+                apiInstance.playersPlayerIdRenamePost(playerId);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling DefaultApi.playersPlayerIdRenamePost: " + e.Message );
+            }
+        }
+    }
+}
+
+
+ +
+
<?php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\ApiDefaultApi();
+$playerId = ; //  | 
+
+try {
+    $api_instance->playersPlayerIdRenamePost($playerId);
+} catch (Exception $e) {
+    echo 'Exception when calling DefaultApi->playersPlayerIdRenamePost: ', $e->getMessage(), PHP_EOL;
+}
+?>
+
+ +
+
use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::DefaultApi;
+
+my $api_instance = WWW::SwaggerClient::DefaultApi->new();
+my $playerId = ; #  | 
+
+eval { 
+    $api_instance->playersPlayerIdRenamePost(playerId => $playerId);
+};
+if ($@) {
+    warn "Exception when calling DefaultApi->playersPlayerIdRenamePost: $@\n";
+}
+
+ +
+
from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.DefaultApi()
+playerId =  #  | 
+
+try: 
+    api_instance.players_player_id_rename_post(playerId)
+except ApiException as e:
+    print("Exception when calling DefaultApi->playersPlayerIdRenamePost: %s\n" % e)
+
+
+ +

Parameters

+ +
Path parameters
+ + + + + + + + +
NameDescription
playerId* + + +
+
+
+ + + + +
+
+ Required +
+
+
+
+ + + + + +

Responses

+
+
+
+
+
+
+

playersPlayerIdTradePost

+

+
+
+
+

+

+

+
+
/players/{playerId}/trade
+

+

Usage and SDK Samples

+

+ + +
+
+
curl -X POST\
+"//players/{playerId}/trade"
+
+
+
import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.DefaultApi;
+
+import java.io.File;
+import java.util.*;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        
+        DefaultApi apiInstance = new DefaultApi();
+         playerId = ; //  | 
+        try {
+            apiInstance.playersPlayerIdTradePost(playerId);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#playersPlayerIdTradePost");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
import io.swagger.client.api.DefaultApi;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        DefaultApi apiInstance = new DefaultApi();
+         playerId = ; //  | 
+        try {
+            apiInstance.playersPlayerIdTradePost(playerId);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#playersPlayerIdTradePost");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
 *playerId = ; // 
+
+DefaultApi *apiInstance = [[DefaultApi alloc] init];
+
+[apiInstance playersPlayerIdTradePostWith:playerId
+              completionHandler: ^(NSError* error) {
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+
+
+ +
+
var UntitledApi = require('untitled_api');
+
+var api = new UntitledApi.DefaultApi()
+var playerId = ; // {{}} 
+
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully.');
+  }
+};
+api.playersPlayerIdTradePost(playerId, callback);
+
+
+ + +
+
using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class playersPlayerIdTradePostExample
+    {
+        public void main()
+        {
+
+            var apiInstance = new DefaultApi();
+            var playerId = new (); //  | 
+
+            try
+            {
+                apiInstance.playersPlayerIdTradePost(playerId);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling DefaultApi.playersPlayerIdTradePost: " + e.Message );
+            }
+        }
+    }
+}
+
+
+ +
+
<?php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\ApiDefaultApi();
+$playerId = ; //  | 
+
+try {
+    $api_instance->playersPlayerIdTradePost($playerId);
+} catch (Exception $e) {
+    echo 'Exception when calling DefaultApi->playersPlayerIdTradePost: ', $e->getMessage(), PHP_EOL;
+}
+?>
+
+ +
+
use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::DefaultApi;
+
+my $api_instance = WWW::SwaggerClient::DefaultApi->new();
+my $playerId = ; #  | 
+
+eval { 
+    $api_instance->playersPlayerIdTradePost(playerId => $playerId);
+};
+if ($@) {
+    warn "Exception when calling DefaultApi->playersPlayerIdTradePost: $@\n";
+}
+
+ +
+
from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.DefaultApi()
+playerId =  #  | 
+
+try: 
+    api_instance.players_player_id_trade_post(playerId)
+except ApiException as e:
+    print("Exception when calling DefaultApi->playersPlayerIdTradePost: %s\n" % e)
+
+
+ +

Parameters

+ +
Path parameters
+ + + + + + + + +
NameDescription
playerId* + + +
+
+
+ + + + +
+
+ Required +
+
+
+
+ + + + + +

Responses

+
+
+
+
+
+
+

playersPlayerIdTravelPost

+

+
+
+
+

+

+

+
+
/players/{playerId}/travel
+

+

Usage and SDK Samples

+

+ + +
+
+
curl -X POST\
+"//players/{playerId}/travel"
+
+
+
import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.DefaultApi;
+
+import java.io.File;
+import java.util.*;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        
+        DefaultApi apiInstance = new DefaultApi();
+         playerId = ; //  | 
+        try {
+            apiInstance.playersPlayerIdTravelPost(playerId);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#playersPlayerIdTravelPost");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
import io.swagger.client.api.DefaultApi;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        DefaultApi apiInstance = new DefaultApi();
+         playerId = ; //  | 
+        try {
+            apiInstance.playersPlayerIdTravelPost(playerId);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#playersPlayerIdTravelPost");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
 *playerId = ; // 
+
+DefaultApi *apiInstance = [[DefaultApi alloc] init];
+
+[apiInstance playersPlayerIdTravelPostWith:playerId
+              completionHandler: ^(NSError* error) {
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+
+
+ +
+
var UntitledApi = require('untitled_api');
+
+var api = new UntitledApi.DefaultApi()
+var playerId = ; // {{}} 
+
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully.');
+  }
+};
+api.playersPlayerIdTravelPost(playerId, callback);
+
+
+ + +
+
using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class playersPlayerIdTravelPostExample
+    {
+        public void main()
+        {
+
+            var apiInstance = new DefaultApi();
+            var playerId = new (); //  | 
+
+            try
+            {
+                apiInstance.playersPlayerIdTravelPost(playerId);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling DefaultApi.playersPlayerIdTravelPost: " + e.Message );
+            }
+        }
+    }
+}
+
+
+ +
+
<?php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\ApiDefaultApi();
+$playerId = ; //  | 
+
+try {
+    $api_instance->playersPlayerIdTravelPost($playerId);
+} catch (Exception $e) {
+    echo 'Exception when calling DefaultApi->playersPlayerIdTravelPost: ', $e->getMessage(), PHP_EOL;
+}
+?>
+
+ +
+
use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::DefaultApi;
+
+my $api_instance = WWW::SwaggerClient::DefaultApi->new();
+my $playerId = ; #  | 
+
+eval { 
+    $api_instance->playersPlayerIdTravelPost(playerId => $playerId);
+};
+if ($@) {
+    warn "Exception when calling DefaultApi->playersPlayerIdTravelPost: $@\n";
+}
+
+ +
+
from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.DefaultApi()
+playerId =  #  | 
+
+try: 
+    api_instance.players_player_id_travel_post(playerId)
+except ApiException as e:
+    print("Exception when calling DefaultApi->playersPlayerIdTravelPost: %s\n" % e)
+
+
+ +

Parameters

+ +
Path parameters
+ + + + + + + + +
NameDescription
playerId* + + +
+
+
+ + + + +
+
+ Required +
+
+
+
+ + + + + +

Responses

+
+
+
+
+
+
+

playersPost

+

Create a new Player

+
+
+
+

+

Create a new Player with a unique ID

+

+
+
/players
+

+

Usage and SDK Samples

+

+ + +
+
+
curl -X POST\
+-H "Accept: application/json"\
+"//players"
+
+
+
import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.DefaultApi;
+
+import java.io.File;
+import java.util.*;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        
+        DefaultApi apiInstance = new DefaultApi();
+        try {
+            Player result = apiInstance.playersPost();
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#playersPost");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
import io.swagger.client.api.DefaultApi;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        DefaultApi apiInstance = new DefaultApi();
+        try {
+            Player result = apiInstance.playersPost();
+            System.out.println(result);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#playersPost");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+

+DefaultApi *apiInstance = [[DefaultApi alloc] init];
+
+// Create a new Player
+[apiInstance playersPostWithCompletionHandler: 
+              ^(Player output, NSError* error) {
+                            if (output) {
+                                NSLog(@"%@", output);
+                            }
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+
+
+ +
+
var UntitledApi = require('untitled_api');
+
+var api = new UntitledApi.DefaultApi()
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully. Returned data: ' + data);
+  }
+};
+api.playersPost(callback);
+
+
+ + +
+
using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class playersPostExample
+    {
+        public void main()
+        {
+
+            var apiInstance = new DefaultApi();
+
+            try
+            {
+                // Create a new Player
+                Player result = apiInstance.playersPost();
+                Debug.WriteLine(result);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling DefaultApi.playersPost: " + e.Message );
+            }
+        }
+    }
+}
+
+
+ +
+
<?php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\ApiDefaultApi();
+
+try {
+    $result = $api_instance->playersPost();
+    print_r($result);
+} catch (Exception $e) {
+    echo 'Exception when calling DefaultApi->playersPost: ', $e->getMessage(), PHP_EOL;
+}
+?>
+
+ +
+
use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::DefaultApi;
+
+my $api_instance = WWW::SwaggerClient::DefaultApi->new();
+
+eval { 
+    my $result = $api_instance->playersPost();
+    print Dumper($result);
+};
+if ($@) {
+    warn "Exception when calling DefaultApi->playersPost: $@\n";
+}
+
+ +
+
from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.DefaultApi()
+
+try: 
+    # Create a new Player
+    api_response = api_instance.players_post()
+    pprint(api_response)
+except ApiException as e:
+    print("Exception when calling DefaultApi->playersPost: %s\n" % e)
+
+
+ +

Parameters

+ + + + + + +

Responses

+

Status: 200 - A Player with unique ID

+ + + +
+
+
+ +
+ +
+
+ +

Status: 400 - An error occured creating the user

+ + + +
+
+ +
+
+
+
+
+
+

wsGet

+

+
+
+
+

+

+

+
+
/ws
+

+

Usage and SDK Samples

+

+ + +
+
+
curl -X GET\
+"//ws"
+
+
+
import io.swagger.client.*;
+import io.swagger.client.auth.*;
+import io.swagger.client.model.*;
+import io.swagger.client.api.DefaultApi;
+
+import java.io.File;
+import java.util.*;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        
+        DefaultApi apiInstance = new DefaultApi();
+         connection = ; //  | 
+         upgrade = ; //  | 
+        try {
+            apiInstance.wsGet(connection, upgrade);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#wsGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
import io.swagger.client.api.DefaultApi;
+
+public class DefaultApiExample {
+
+    public static void main(String[] args) {
+        DefaultApi apiInstance = new DefaultApi();
+         connection = ; //  | 
+         upgrade = ; //  | 
+        try {
+            apiInstance.wsGet(connection, upgrade);
+        } catch (ApiException e) {
+            System.err.println("Exception when calling DefaultApi#wsGet");
+            e.printStackTrace();
+        }
+    }
+}
+
+ +
+
 *connection = ; //  (optional)
+ *upgrade = ; //  (optional)
+
+DefaultApi *apiInstance = [[DefaultApi alloc] init];
+
+[apiInstance wsGetWith:connection
+    upgrade:upgrade
+              completionHandler: ^(NSError* error) {
+                            if (error) {
+                                NSLog(@"Error: %@", error);
+                            }
+                        }];
+
+
+ +
+
var UntitledApi = require('untitled_api');
+
+var api = new UntitledApi.DefaultApi()
+var opts = { 
+  'connection': , // {{}} 
+  'upgrade':  // {{}} 
+};
+var callback = function(error, data, response) {
+  if (error) {
+    console.error(error);
+  } else {
+    console.log('API called successfully.');
+  }
+};
+api.wsGet(opts, callback);
+
+
+ + +
+
using System;
+using System.Diagnostics;
+using IO.Swagger.Api;
+using IO.Swagger.Client;
+using IO.Swagger.Model;
+
+namespace Example
+{
+    public class wsGetExample
+    {
+        public void main()
+        {
+
+            var apiInstance = new DefaultApi();
+            var connection = new (); //  |  (optional) 
+            var upgrade = new (); //  |  (optional) 
+
+            try
+            {
+                apiInstance.wsGet(connection, upgrade);
+            }
+            catch (Exception e)
+            {
+                Debug.Print("Exception when calling DefaultApi.wsGet: " + e.Message );
+            }
+        }
+    }
+}
+
+
+ +
+
<?php
+require_once(__DIR__ . '/vendor/autoload.php');
+
+$api_instance = new Swagger\Client\ApiDefaultApi();
+$connection = ; //  | 
+$upgrade = ; //  | 
+
+try {
+    $api_instance->wsGet($connection, $upgrade);
+} catch (Exception $e) {
+    echo 'Exception when calling DefaultApi->wsGet: ', $e->getMessage(), PHP_EOL;
+}
+?>
+
+ +
+
use Data::Dumper;
+use WWW::SwaggerClient::Configuration;
+use WWW::SwaggerClient::DefaultApi;
+
+my $api_instance = WWW::SwaggerClient::DefaultApi->new();
+my $connection = ; #  | 
+my $upgrade = ; #  | 
+
+eval { 
+    $api_instance->wsGet(connection => $connection, upgrade => $upgrade);
+};
+if ($@) {
+    warn "Exception when calling DefaultApi->wsGet: $@\n";
+}
+
+ +
+
from __future__ import print_statement
+import time
+import swagger_client
+from swagger_client.rest import ApiException
+from pprint import pprint
+
+# create an instance of the API class
+api_instance = swagger_client.DefaultApi()
+connection =  #  |  (optional)
+upgrade =  #  |  (optional)
+
+try: 
+    api_instance.ws_get(connection=connection, upgrade=upgrade)
+except ApiException as e:
+    print("Exception when calling DefaultApi->wsGet: %s\n" % e)
+
+
+ +

Parameters

+ + +
Header parameters
+ + + + + + + + + + + +
NameDescription
Connection + + +
+
+
+ + + + +
+
+
+
Upgrade + + +
+
+
+ + + + +
+
+
+
+ + + + +

Responses

+
+
+
+
+
+ +
+
+
+ + + + + + + + + diff --git a/server/src/main/kotlin/dev/geekback/dopewars/server/Server.kt b/server/src/main/kotlin/dev/geekback/dopewars/server/Server.kt index c76a2b8..318f2f9 100644 --- a/server/src/main/kotlin/dev/geekback/dopewars/server/Server.kt +++ b/server/src/main/kotlin/dev/geekback/dopewars/server/Server.kt @@ -68,7 +68,7 @@ fun Application.module() { */ } - staticResources("/", "") + staticResources("/", "web") } } diff --git a/server/src/main/resources/index.html b/server/src/main/resources/index.html deleted file mode 100644 index cc6e538..0000000 --- a/server/src/main/resources/index.html +++ /dev/null @@ -1,3 +0,0 @@ - -

This is the default page.

- \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 5f98908..a950846 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,7 @@ +import org.gradle.api.initialization.resolve.RepositoriesMode + rootProject.name = "dopewars" -include(":shared", ":server", ":desktop") +include(":shared", ":shared_ui", ":server", ":desktop", ":web") pluginManagement { repositories { @@ -10,6 +12,8 @@ pluginManagement { } dependencyResolutionManagement { + // repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { google() mavenCentral() diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index bf4a509..e8ad46f 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -1,21 +1,29 @@ -plugins { - kotlin("multiplatform") - alias(libs.plugins.kotlin.serialization) -} +import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl -repositories { - mavenCentral() +plugins { + // kotlin("multiplatform") + alias(libs.plugins.kotlin.multiplatform) + alias(libs.plugins.kotlin.serialization) } kotlin { jvm() + @OptIn(ExperimentalWasmDsl::class) + wasmJs { + browser() + } + sourceSets { commonMain.dependencies { implementation(libs.kotlinx.serialization) implementation(libs.kotlinx.datetime) } + wasmJsMain.dependencies { + implementation(libs.wrappers.browser) + } + jvmMain.dependencies {} } } diff --git a/shared_ui/build.gradle.kts b/shared_ui/build.gradle.kts new file mode 100644 index 0000000..91ffa78 --- /dev/null +++ b/shared_ui/build.gradle.kts @@ -0,0 +1,30 @@ +@file:OptIn(ExperimentalWasmDsl::class) + +import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl + +plugins { + alias(libs.plugins.kotlin.multiplatform) +} + +kotlin { + jvm() + + wasmJs { + } + + sourceSets { + commonMain.dependencies { + implementation(project(":shared")) + implementation(libs.compose.material3) + implementation(libs.compose.runtime) + implementation(libs.compose.foundation) + implementation(libs.compose.ui) + } + + wasmJsMain.dependencies { + implementation(libs.wrappers.browser) + } + + jvmMain.dependencies {} + } +} diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/AppTheme.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/AppTheme.kt similarity index 97% rename from desktop/src/main/kotlin/dev/geekback/dopewars/desktop/AppTheme.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/AppTheme.kt index f2f881c..7ecc748 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/desktop/AppTheme.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/AppTheme.kt @@ -1,4 +1,4 @@ -package dev.geekback.dopewars.desktop +package dev.geekback.dopewars.ui import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.border diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/DopeWarsModelUi.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/DopeWarsModelUi.kt similarity index 95% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/DopeWarsModelUi.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/DopeWarsModelUi.kt index 5be4a88..4e87710 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/DopeWarsModelUi.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/DopeWarsModelUi.kt @@ -1,7 +1,6 @@ package dev.geekback.dopewars.ui import androidx.compose.runtime.Composable -import dev.geekback.dopewars.shared.DrugInfo import dev.geekback.dopewars.ui.api.ApiUi interface DopeWarsModelUi { diff --git a/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/TravelUi.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/TravelUi.kt new file mode 100644 index 0000000..7982d0a --- /dev/null +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/TravelUi.kt @@ -0,0 +1,85 @@ +package dev.geekback.dopewars.ui + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import dev.geekback.dopewars.shared.Locations +import dev.geekback.dopewars.shared.Player +import dev.geekback.dopewars.shared.api.TravelRequest + +class TravelUi { + /* + Wizard + + Holds the users hand through picking a new location + */ + @Composable + fun wizard(current: Player, onTicketPunched: (TravelRequest) -> Unit) { + var stage by remember { mutableStateOf(0) } + var pickedLocation by remember { mutableStateOf(0) } + val locations = Locations.all + var expanded by remember { mutableStateOf(false) } + // Window(onCloseRequest = { onTicketPunched(TravelRequest(destination = current.location)) }, title = "Select New Location") { + /* + Card(modifier = Modifier.padding(16.dp).fillMaxSize()) { + Column { + Text("Wizard") + var index = 0; + when (stage) { + 0 -> { + Text(text = locations[pickedLocation].name) + IconButton(onClick = { expanded = !expanded }) { + // Icon(MaterialIcons.Filled.Menu, contentDescription = "More options") + } + DropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + locations.forEach { + DropdownMenuItem( + text = { Text("$it.name / $index")}, + onClick = { + expanded = false + pickedLocation = (index - 1) + println("location index to $index") + } + ) + index += 1; + } + } + + Button(onClick = { + stage += 1 + }) { + Text("Next Step") + } + } + 1 -> { + Text("Stage 1") + Button(onClick = { + println("Selected Location - $pickedLocation") + onTicketPunched(TravelRequest(locations[pickedLocation])) + }) { + Text("Finish") + } + } + } + } + } + */ + // } + } +} \ No newline at end of file diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/ApiUi.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/ApiUi.kt similarity index 100% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/ApiUi.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/ApiUi.kt diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/MarketRequestUi.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/MarketRequestUi.kt similarity index 96% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/MarketRequestUi.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/MarketRequestUi.kt index e02d35f..d485a5c 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/MarketRequestUi.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/MarketRequestUi.kt @@ -9,8 +9,8 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import dev.geekback.dopewars.desktop.BorderedCard import dev.geekback.dopewars.shared.api.MarketRequest +import dev.geekback.dopewars.ui.BorderedCard import dev.geekback.dopewars.ui.DopeWarsModelUi import dev.geekback.dopewars.ui.LocationUi diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/MarketResponseUi.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/MarketResponseUi.kt similarity index 93% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/MarketResponseUi.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/MarketResponseUi.kt index 11b1c2e..13d2669 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/MarketResponseUi.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/MarketResponseUi.kt @@ -1,8 +1,8 @@ package dev.geekback.dopewars.ui.api import androidx.compose.runtime.Composable -import dev.geekback.dopewars.desktop.BorderedCard import dev.geekback.dopewars.shared.api.MarketResult +import dev.geekback.dopewars.ui.BorderedCard import dev.geekback.dopewars.ui.DopeWarsModelUi import dev.geekback.dopewars.ui.MarketUi diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateRequestUi.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateRequestUi.kt similarity index 94% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateRequestUi.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateRequestUi.kt index 70634f8..be999a5 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateRequestUi.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateRequestUi.kt @@ -3,9 +3,9 @@ package dev.geekback.dopewars.ui.api import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import dev.geekback.dopewars.desktop.BorderedCard import dev.geekback.dopewars.ui.DopeWarsModelUi import dev.geekback.dopewars.shared.api.PlayerNameUpdateRequest +import dev.geekback.dopewars.ui.BorderedCard class PlayerNameUpdateRequestUi(): DopeWarsModelUi { @Composable diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateResponseUi.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateResponseUi.kt similarity index 93% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateResponseUi.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateResponseUi.kt index 6fa3556..a3dcb53 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateResponseUi.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/PlayerNameUpdateResponseUi.kt @@ -1,10 +1,10 @@ package dev.geekback.dopewars.ui.api import androidx.compose.runtime.Composable -import dev.geekback.dopewars.desktop.BorderedCard import dev.geekback.dopewars.ui.DopeWarsModelUi import dev.geekback.dopewars.ui.PlayerUi import dev.geekback.dopewars.shared.api.PlayerNameUpdateResponse +import dev.geekback.dopewars.ui.BorderedCard class PlayerNameUpdateResponseUi: DopeWarsModelUi { @Composable diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/TradeRequestUi.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/TradeRequestUi.kt similarity index 96% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/TradeRequestUi.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/TradeRequestUi.kt index 8850e9f..21e0d6d 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/TradeRequestUi.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/TradeRequestUi.kt @@ -8,8 +8,8 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import dev.geekback.dopewars.desktop.BorderedCard import dev.geekback.dopewars.shared.api.TradeRequest +import dev.geekback.dopewars.ui.BorderedCard import dev.geekback.dopewars.ui.DopeWarsModelUi class TradeRequestUi: DopeWarsModelUi { diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/TravelRequestUi.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/TravelRequestUi.kt similarity index 92% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/TravelRequestUi.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/TravelRequestUi.kt index 3fd84b4..9ef2b1e 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/TravelRequestUi.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/TravelRequestUi.kt @@ -2,9 +2,9 @@ package dev.geekback.dopewars.ui.api import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import dev.geekback.dopewars.desktop.BorderedCard import dev.geekback.dopewars.ui.DopeWarsModelUi import dev.geekback.dopewars.shared.api.TravelRequest +import dev.geekback.dopewars.ui.BorderedCard class TravelRequestUi: DopeWarsModelUi { @Composable diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/TravelResponseUi.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/TravelResponseUi.kt similarity index 83% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/TravelResponseUi.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/TravelResponseUi.kt index 72aaac1..1e18b1e 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/api/TravelResponseUi.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/api/TravelResponseUi.kt @@ -8,8 +8,8 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import dev.geekback.dopewars.desktop.BorderedCard import dev.geekback.dopewars.shared.api.TravelResult +import dev.geekback.dopewars.ui.BorderedCard import dev.geekback.dopewars.ui.DopeWarsModelUi import dev.geekback.dopewars.ui.LocationUi import dev.geekback.dopewars.ui.MarketUi @@ -38,15 +38,17 @@ class TravelResponseUi: DopeWarsModelUi { println("Update location to $it") } - Row { - Button(onClick = {}) { - Text("Apply") - } - - Button(onClick = {}) { - Text("Cancel") - } - } +// +// +// Row { +// Button(onClick = {}) { +// Text("Apply") +// } +// +// Button(onClick = {}) { +// Text("Cancel") +// } +// } } } diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/drug.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/drug.kt similarity index 97% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/drug.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/drug.kt index c64b81d..5cc5a8e 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/drug.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/drug.kt @@ -3,7 +3,6 @@ package dev.geekback.dopewars.ui import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.material3.Button -import androidx.compose.material3.DropdownMenu import androidx.compose.material3.RangeSlider import androidx.compose.material3.Text import androidx.compose.material3.TextField @@ -13,7 +12,6 @@ import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import dev.geekback.dopewars.desktop.BorderedCard import dev.geekback.dopewars.shared.DRUG_MAX_PRICE import dev.geekback.dopewars.shared.Drug import dev.geekback.dopewars.shared.DrugInfo diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/inventory.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/inventory.kt similarity index 93% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/inventory.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/inventory.kt index 2e3b474..cf3bdce 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/inventory.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/inventory.kt @@ -3,7 +3,6 @@ package dev.geekback.dopewars.ui import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import dev.geekback.dopewars.desktop.BorderedCard import dev.geekback.dopewars.shared.InventoryItem class InventoryUi: DopeWarsModelUi> { diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/inventoryItem.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/inventoryItem.kt similarity index 100% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/inventoryItem.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/inventoryItem.kt diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/location.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/location.kt similarity index 96% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/location.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/location.kt index 593fd13..f8dd3fc 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/location.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/location.kt @@ -10,7 +10,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import dev.geekback.dopewars.desktop.BorderedCard import dev.geekback.dopewars.shared.Location class LocationUi: DopeWarsModelUi { diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/market.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/market.kt similarity index 95% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/market.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/market.kt index 4ea6823..7f06b53 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/market.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/market.kt @@ -4,7 +4,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import dev.geekback.dopewars.desktop.BorderedCard import dev.geekback.dopewars.shared.Market class MarketUi: DopeWarsModelUi { diff --git a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/player.kt b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/player.kt similarity index 90% rename from desktop/src/main/kotlin/dev/geekback/dopewars/ui/player.kt rename to shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/player.kt index 29c93a9..bcf287a 100644 --- a/desktop/src/main/kotlin/dev/geekback/dopewars/ui/player.kt +++ b/shared_ui/src/commonMain/kotlin/dev/geekback/dopewars/ui/player.kt @@ -4,9 +4,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import dev.geekback.dopewars.desktop.BorderedCard -import dev.geekback.dopewars.shared.Location -import dev.geekback.dopewars.shared.Market import dev.geekback.dopewars.shared.Player import kotlin.time.Instant diff --git a/web/build.gradle.kts b/web/build.gradle.kts new file mode 100644 index 0000000..83718c9 --- /dev/null +++ b/web/build.gradle.kts @@ -0,0 +1,66 @@ +import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl + +plugins { + alias(libs.plugins.kotlin.multiplatform) + alias(libs.plugins.compose) + alias(libs.plugins.kotlin.compose) +} + +kotlin { + @OptIn(ExperimentalWasmDsl::class) + wasmJs { + browser() + binaries.executable() + } + + sourceSets { + commonMain.dependencies { + implementation(project(":shared")) + + implementation(compose.runtime) + implementation(compose.foundation) + implementation(compose.material3) + implementation(compose.ui) + } + + wasmJsMain.dependencies { + } + } +} + +/* + * The directory produced by wasmJsBrowserDistribution. + * + * This is deliberately kept here rather than being referenced by + * the server project. The web project owns its build layout. + */ +val webDistributionDirectory = + layout.buildDirectory.dir("dist/wasmJs/productionExecutable") + +/* + * Expose the web distribution as an outgoing artifact. + * + * Other projects can consume: + * + * project(path = ":web", configuration = "webDistribution") + * + * without knowing where the files actually live. + */ +val webDistributionTask = + tasks.named("wasmJsBrowserDistribution") + +configurations { + create("webDistribution") { + isCanBeConsumed = true + isCanBeResolved = false + } +} + +artifacts { + add( + "webDistribution", + webDistributionDirectory + ) { + builtBy(webDistributionTask) + } +} \ No newline at end of file diff --git a/web/build/processedResources/wasmJs/main/index.html b/web/build/processedResources/wasmJs/main/index.html new file mode 100644 index 0000000..be5bedc --- /dev/null +++ b/web/build/processedResources/wasmJs/main/index.html @@ -0,0 +1,21 @@ + + + + + + KotlinProject + + + +

Web Client HTML

+ + + + + + + + + \ No newline at end of file diff --git a/web/src/webMain/kotlin/dev/geekback/dopewars/web/main.kt b/web/src/webMain/kotlin/dev/geekback/dopewars/web/main.kt new file mode 100644 index 0000000..5de362a --- /dev/null +++ b/web/src/webMain/kotlin/dev/geekback/dopewars/web/main.kt @@ -0,0 +1,24 @@ +package dev.geekback.dopewars.web + +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.material3.Text +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.ComposeViewport + +@OptIn(ExperimentalComposeUiApi::class) +fun main() { + ComposeViewport { + App() + } +} + +@Composable +fun App() { + MaterialTheme { + Text(modifier = Modifier.padding(16.dp), text = "Taxation is theft") + } +} diff --git a/web/src/webMain/resources/index.html b/web/src/webMain/resources/index.html new file mode 100644 index 0000000..be5bedc --- /dev/null +++ b/web/src/webMain/resources/index.html @@ -0,0 +1,21 @@ + + + + + + KotlinProject + + + +

Web Client HTML

+ + + + + + + + + \ No newline at end of file diff --git a/web/src/webMain/resources/styles.css b/web/src/webMain/resources/styles.css new file mode 100644 index 0000000..0549b10 --- /dev/null +++ b/web/src/webMain/resources/styles.css @@ -0,0 +1,7 @@ +html, body { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + overflow: hidden; +} \ No newline at end of file