Complete wizard (1:1 features of original).

This commit is contained in:
Kalila L 2021-09-06 19:38:34 -04:00
parent bdd92a30fe
commit 10306807ef
18 changed files with 697 additions and 62 deletions

View file

@ -5866,6 +5866,11 @@
}
}
},
"js-sha256": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz",
"integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA=="
},
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",

View file

@ -14,6 +14,7 @@
"@quasar/extras": "^1.0.0",
"axios": "^0.21.1",
"core-js": "^3.6.5",
"js-sha256": "^0.9.0",
"quasar": "^2.0.0",
"three": "^0.132.2",
"vanta": "^0.5.21",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 859 B

After

Width:  |  Height:  |  Size: 871 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -88,7 +88,7 @@ module.exports = configure(function (ctx) {
// https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-framework
framework: {
config: {
dark: 'auto'
dark: "auto"
},
// iconSet: 'material-icons', // Quasar icon set
@ -103,7 +103,8 @@ module.exports = configure(function (ctx) {
// Quasar plugins
plugins: [
'Notify'
"Notify",
"Loading"
]
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

View file

@ -1,15 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 356 360">
<path
d="M43.4 303.4c0 3.8-2.3 6.3-7.1 6.3h-15v-22h14.4c4.3 0 6.2 2.2 6.2 5.2 0 2.6-1.5 4.4-3.4 5 2.8.4 4.9 2.5 4.9 5.5zm-8-13H24.1v6.9H35c2.1 0 4-1.3 4-3.8 0-2.2-1.3-3.1-3.7-3.1zm5.1 12.6c0-2.3-1.8-3.7-4-3.7H24.2v7.7h11.7c3.4 0 4.6-1.8 4.6-4zm36.3 4v2.7H56v-22h20.6v2.7H58.9v6.8h14.6v2.3H58.9v7.5h17.9zm23-5.8v8.5H97v-8.5l-11-13.4h3.4l8.9 11 8.8-11h3.4l-10.8 13.4zm19.1-1.8V298c0-7.9 5.2-10.7 12.7-10.7 7.5 0 13 2.8 13 10.7v1.4c0 7.9-5.5 10.8-13 10.8s-12.7-3-12.7-10.8zm22.7 0V298c0-5.7-3.9-8-10-8-6 0-9.8 2.3-9.8 8v1.4c0 5.8 3.8 8.1 9.8 8.1 6 0 10-2.3 10-8.1zm37.2-11.6v21.9h-2.9l-15.8-17.9v17.9h-2.8v-22h3l15.6 18v-18h2.9zm37.9 10.2v1.3c0 7.8-5.2 10.4-12.4 10.4H193v-22h11.2c7.2 0 12.4 2.8 12.4 10.3zm-3 0c0-5.3-3.3-7.6-9.4-7.6h-8.4V307h8.4c6 0 9.5-2 9.5-7.7V298zm50.8-7.6h-9.7v19.3h-3v-19.3h-9.7v-2.6h22.4v2.6zm34.4-2.6v21.9h-3v-10.1h-16.8v10h-2.8v-21.8h2.8v9.2H296v-9.2h2.9zm34.9 19.2v2.7h-20.7v-22h20.6v2.7H316v6.8h14.5v2.3H316v7.5h17.8zM24 340.2v7.3h13.9v2.4h-14v9.6H21v-22h20v2.7H24zm41.5 11.4h-9.8v7.9H53v-22h13.3c5.1 0 8 1.9 8 6.8 0 3.7-2 6.3-5.6 7l6 8.2h-3.3l-5.8-8zm-9.8-2.6H66c3.1 0 5.3-1.5 5.3-4.7 0-3.3-2.2-4.1-5.3-4.1H55.7v8.8zm47.9 6.2H89l-2 4.3h-3.2l10.7-22.2H98l10.7 22.2h-3.2l-2-4.3zm-1-2.3l-6.3-13-6 13h12.2zm46.3-15.3v21.9H146v-17.2L135.7 358h-2.1l-10.2-15.6v17h-2.8v-21.8h3l11 16.9 11.3-17h3zm35 19.3v2.6h-20.7v-22h20.6v2.7H166v6.8h14.5v2.3H166v7.6h17.8zm47-19.3l-8.3 22h-3l-7.1-18.6-7 18.6h-3l-8.2-22h3.3L204 356l6.8-18.5h3.4L221 356l6.6-18.5h3.3zm10 11.6v-1.4c0-7.8 5.2-10.7 12.7-10.7 7.6 0 13 2.9 13 10.7v1.4c0 7.9-5.4 10.8-13 10.8-7.5 0-12.7-3-12.7-10.8zm22.8 0v-1.4c0-5.7-4-8-10-8s-9.9 2.3-9.9 8v1.4c0 5.8 3.8 8.2 9.8 8.2 6.1 0 10-2.4 10-8.2zm28.3 2.4h-9.8v7.9h-2.8v-22h13.2c5.2 0 8 1.9 8 6.8 0 3.7-2 6.3-5.6 7l6 8.2h-3.3l-5.8-8zm-9.8-2.6h10.2c3 0 5.2-1.5 5.2-4.7 0-3.3-2.1-4.1-5.2-4.1h-10.2v8.8zm40.3-1.5l-6.8 5.6v6.4h-2.9v-22h2.9v12.3l15.2-12.2h3.7l-9.9 8.1 10.3 13.8h-3.6l-8.9-12z" />
<path fill="#050A14"
d="M188.4 71.7a10.4 10.4 0 01-20.8 0 10.4 10.4 0 1120.8 0zM224.2 45c-2.2-3.9-5-7.5-8.2-10.7l-12 7c-3.7-3.2-8-5.7-12.6-7.3a49.4 49.4 0 00-9.7 13.9 59 59 0 0140.1 14l7.6-4.4a57 57 0 00-5.2-12.5zM178 125.1c4.5 0 9-.6 13.4-1.7v-14a40 40 0 0012.5-7.2 47.7 47.7 0 00-7.1-15.3 59 59 0 01-32.2 27.7v8.7c4.4 1.2 8.9 1.8 13.4 1.8zM131.8 45c-2.3 4-4 8.1-5.2 12.5l12 7a40 40 0 000 14.4c5.7 1.5 11.3 2 16.9 1.5a59 59 0 01-8-41.7l-7.5-4.3c-3.2 3.2-6 6.7-8.2 10.6z" />
<path fill="#00B4FF"
d="M224.2 98.4c2.3-3.9 4-8 5.2-12.4l-12-7a40 40 0 000-14.5c-5.7-1.5-11.3-2-16.9-1.5a59 59 0 018 41.7l7.5 4.4c3.2-3.2 6-6.8 8.2-10.7zm-92.4 0c2.2 4 5 7.5 8.2 10.7l12-7a40 40 0 0012.6 7.3c4-4.1 7.3-8.8 9.7-13.8a59 59 0 01-40-14l-7.7 4.4c1.2 4.3 3 8.5 5.2 12.4zm46.2-80c-4.5 0-9 .5-13.4 1.7V34a40 40 0 00-12.5 7.2c1.5 5.7 4 10.8 7.1 15.4a59 59 0 0132.2-27.7V20a53.3 53.3 0 00-13.4-1.8z" />
<path fill="#00B4FF"
d="M178 9.2a62.6 62.6 0 11-.1 125.2A62.6 62.6 0 01178 9.2m0-9.2a71.7 71.7 0 100 143.5A71.7 71.7 0 00178 0z" />
<path fill="#050A14"
d="M96.6 212v4.3c-9.2-.8-15.4-5.8-15.4-17.8V180h4.6v18.4c0 8.6 4 12.6 10.8 13.5zm16-31.9v18.4c0 8.9-4.3 12.8-10.9 13.5v4.4c9.2-.7 15.5-5.6 15.5-18v-18.3h-4.7zM62.2 199v-2.2c0-12.7-8.8-17.4-21-17.4-12.1 0-20.7 4.7-20.7 17.4v2.2c0 12.8 8.6 17.6 20.7 17.6 1.5 0 3-.1 4.4-.3l11.8 6.2 2-3.3-8.2-4-6.4-3.1a32 32 0 01-3.6.2c-9.8 0-16-3.9-16-13.3v-2.2c0-9.3 6.2-13.1 16-13.1 9.9 0 16.3 3.8 16.3 13.1v2.2c0 5.3-2.1 8.7-5.6 10.8l4.8 2.4c3.4-2.8 5.5-7 5.5-13.2zM168 215.6h5.1L156 179.7h-4.8l17 36zM143 205l7.4-15.7-2.4-5-15.1 31.4h5.1l3.3-7h18.3l-1.8-3.7H143zm133.7 10.7h5.2l-17.3-35.9h-4.8l17 36zm-25-10.7l7.4-15.7-2.4-5-15.1 31.4h5.1l3.3-7h18.3l-1.7-3.7h-14.8zm73.8-2.5c6-1.2 9-5.4 9-11.4 0-8-4.5-10.9-12.9-10.9h-21.4v35.5h4.6v-31.3h16.5c5 0 8.5 1.4 8.5 6.7 0 5.2-3.5 7.7-8.5 7.7h-11.4v4.1h10.7l9.3 12.8h5.5l-9.9-13.2zm-117.4 9.9c-9.7 0-14.7-2.5-18.6-6.3l-2.2 3.8c5.1 5 11 6.7 21 6.7 1.6 0 3.1-.1 4.6-.3l-1.9-4h-3zm18.4-7c0-6.4-4.7-8.6-13.8-9.4l-10.1-1c-6.7-.7-9.3-2.2-9.3-5.6 0-2.5 1.4-4 4.6-5l-1.8-3.8c-4.7 1.4-7.5 4.2-7.5 8.9 0 5.2 3.4 8.7 13 9.6l11.3 1.2c6.4.6 8.9 2 8.9 5.4 0 2.7-2.1 4.7-6 5.8l1.8 3.9c5.3-1.6 8.9-4.7 8.9-10zm-20.3-21.9c7.9 0 13.3 1.8 18.1 5.7l1.8-3.9a30 30 0 00-19.6-5.9c-2 0-4 .1-5.7.3l1.9 4 3.5-.2z" />
<path fill="#00B4FF"
d="M.5 251.9c29.6-.5 59.2-.8 88.8-1l88.7-.3 88.7.3 44.4.4 44.4.6-44.4.6-44.4.4-88.7.3-88.7-.3a7981 7981 0 01-88.8-1z" />
<path fill="none" d="M-565.2 324H-252v15.8h-313.2z" />
</svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

View file

@ -1,3 +1,11 @@
// axios.ts
//
// Created by Kalila L. on Sep. 4th, 2021.
// Copyright 2021 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
import { boot } from "quasar/wrappers";
import axios, { AxiosInstance } from "axios";
import Log from "../modules/utilities/log";

View file

@ -13,6 +13,7 @@
@submit="onSubmit"
@reset="onReset"
class="q-gutter-md"
:autocomplete="AUTOCOMPLETE"
>
<q-input
v-model="username"
@ -66,7 +67,8 @@ export default {
password: "",
showPassword: false,
// TODO: Needs to be stored somewhere central.
DEFAULT_METAVERSE_URL: "https://metaverse.vircadia.com/live"
DEFAULT_METAVERSE_URL: "https://metaverse.vircadia.com/live",
AUTOCOMPLETE: false
}),
methods: {

View file

@ -60,47 +60,48 @@ export default {
"Authorization": `Bearer ${result.data.access_token}`
}
})
.then(async (response) => {
Log.info(Log.types.METAVERSE, `Successfully got Domain token for Metaverse linking.`);
.catch((result) => {
Log.error(Log.types.METAVERSE, "Failed to link server with Metaverse.");
var settingsToCommit = {
this.$q.notify({
type: "negative",
textColor: "white",
icon: "warning",
message: `Metaverse link attempt failed. ${result}`
});
})
.then(async (response) => {
Log.info(Log.types.METAVERSE, "Successfully got Domain token for Metaverse linking.");
const settingsToCommit = {
"metaverse": {
"access_token": response.data.data.token
}
};
var committed = await this.commitSettings(settingsToCommit);
const committed = await this.commitSettings(settingsToCommit);
if (committed === true) {
Log.info(Log.types.METAVERSE, `Successfully committed Domain server access token for the Metaverse.`);
Log.info(Log.types.METAVERSE, "Successfully committed Domain server access token for the Metaverse.");
this.$q.notify({
type: "positive",
textColor: "white",
icon: "cloud_done",
message: `Successfully linked your server to the Metaverse.`
message: "Successfully linked your server to the Metaverse."
});
this.$emit("connectionResult", { "success": true });
} else {
Log.error(Log.types.METAVERSE, `Failed to link server with Metaverse: Could not commit token to settings.`);
Log.error(Log.types.METAVERSE, "Failed to link server with Metaverse: Could not commit token to settings.");
this.$q.notify({
type: "negative",
textColor: "white",
icon: "warning",
message: `Metaverse link attempt failed because the settings were unable to be saved.`
message: "Metaverse link attempt failed because the settings were unable to be saved."
});
this.$emit("connectionResult", { "success": false });
}
})
.catch((result) => {
Log.error(Log.types.METAVERSE, `Failed to link server with Metaverse: ${result.responseJSON.error}`);
this.$q.notify({
type: "negative",
textColor: "white",
icon: "warning",
message: `Metaverse link attempt failed: ${result.responseJSON.error}`
});
});
} else {
this.$q.notify({
@ -115,13 +116,13 @@ export default {
// TODO: This needs to go somewhere universal.
commitSettings (settingsToCommit) {
// TODO: This and all other URL endpoints should be in centralized (in their respective module) constants files.
return axios.post(`/settings.json`, JSON.stringify(settingsToCommit))
.then((response) => {
Log.info(Log.types.DOMAIN, `Successfully committed settings.`);
return axios.post("/settings.json", JSON.stringify(settingsToCommit))
.then(() => {
Log.info(Log.types.DOMAIN, "Successfully committed settings.");
return true;
})
.catch((response) => {
Log.error(Log.types.DOMAIN, `Failed to commit settings to Domain.`);
Log.error(Log.types.DOMAIN, `Failed to commit settings to Domain: ${response}`);
return false;
});
}

View file

@ -1,3 +1,13 @@
<!--
// index.template.html
//
// Created by Kalila L. on Sep. 4th, 2021.
// Copyright 2021 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
-->
<!DOCTYPE html>
<html>
<head>

View file

@ -148,6 +148,7 @@
Start
</q-btn>
<q-btn
@click="mainWizardStep = FINAL_WIZARD_STEP"
size="sm"
flat
>
@ -173,30 +174,30 @@
<q-card-actions vertical align="right">
<q-btn
@click="$refs.stepper.next()"
class="q-mb-md"
size="md"
outline
text-color="white"
icon-right="chevron_right"
>
Skip
</q-btn>
<q-btn
class="q-mb-md"
size="sm"
outline
disabled
text-color="white"
icon-right="upload"
>
Import (coming soon)
</q-btn>
<q-btn
@click="$refs.stepper.next()"
class="q-mb-md"
size="sm"
outline
text-color="white"
icon-right="chevron_right"
>
Skip
</q-btn>
<q-btn
@click="$refs.stepper.previous()"
size="sm"
flat
icon-left="chevron_left"
icon="chevron_left"
>
Back
</q-btn>
@ -244,7 +245,7 @@
@click="$refs.stepper.previous()"
size="sm"
flat
icon-left="chevron_left"
icon="chevron_left"
>
Back
</q-btn>
@ -264,8 +265,8 @@
<q-step
:name="5"
title="Security"
caption="Optional"
title="Access"
caption="Recommended"
:done="mainWizardStep > 5"
>
<q-card
@ -275,6 +276,41 @@
<div class="text-h6 text-weight-light text-center">Let's configure some security settings for your world.</div>
</q-card-section>
<q-card-section>
<div class="text-h6 text-weight-light text-center">Who should be an <b>in-world admin</b> of your Domain?</div>
<q-select
label="Metaverse usernames (press enter)"
filled
v-model="administratorsListSecurityModel"
use-input
use-chips
multiple
hide-dropdown-icon
input-debounce="0"
new-value-mode="add-unique"
/>
</q-card-section>
<q-card-section>
<div class="text-h6 text-weight-light text-center">Who can <b>connect</b> to your Domain?</div>
<q-option-group
v-model="connectionSecurityModel"
:options="connectionSecurityOptions"
color="primary"
type="checkbox"
/>
</q-card-section>
<q-card-section>
<div class="text-h6 text-weight-light text-center">Who can <b>rez</b> items in your Domain?</div>
<q-option-group
v-model="rezSecurityModel"
:options="rezSecurityOptions"
color="primary"
type="checkbox"
/>
</q-card-section>
<q-card-actions vertical align="right">
<q-btn
@click="saveSecuritySettings"
@ -290,13 +326,259 @@
@click="$refs.stepper.previous()"
size="sm"
flat
icon-left="chevron_left"
icon="chevron_left"
>
Back
</q-btn>
</q-card-actions>
</q-card>
</q-step>
<q-step
:name="6"
title="Administrator"
caption="Highly Recommended"
:done="mainWizardStep > 6"
>
<q-card
class="wizardCard"
>
<q-card-section>
<div class="text-h6 text-weight-light text-center">Let's create a username and password for your Domain's administrator web panel.</div>
<div class="text-h7 q-mt-sm text-weight-light text-center">Warning: Immediately after saving the credentials, you will be prompted to enter them into your browser to continue.</div>
</q-card-section>
<q-card-section>
<q-form
@submit="onAdminStepSubmit"
@reset="onAdminStepReset"
class="q-gutter-md"
>
<q-input
v-model="username"
filled
label="Username"
hint="Enter your username."
lazy-rules
:rules="[ val => val && val.length > 0 || 'Please enter a username.']"
/>
<q-input
v-model="password"
filled
label="Password"
:type="showPassword ? 'text' : 'password'"
hint="Enter your password."
lazy-rules
:rules="[ val => val && val.length > 0 || 'Please enter a password.']"
>
<template v-slot:append>
<q-icon
:name="showPassword ? 'visibility' : 'visibility_off'"
class="cursor-pointer"
@click="showPassword = !showPassword"
/>
</template>
</q-input>
<q-input
v-model="confirmPassword"
filled
label="Confirm Password"
:type="showConfirmPassword ? 'text' : 'password'"
hint="Enter your password again."
lazy-rules
:rules="[ val => val && val.length > 0 && val === password || 'Please ensure your passwords match.']"
>
<template v-slot:append>
<q-icon
:name="showConfirmPassword ? 'visibility' : 'visibility_off'"
class="cursor-pointer"
@click="showConfirmPassword = !showConfirmPassword"
/>
</template>
</q-input>
<div align="right">
<q-btn
label="Clear"
type="reset"
size="md"
class="q-mb-md q-mr-sm"
flat
/>
<q-btn
label="Save"
type="submit"
class="q-mb-md"
size="md"
outline
text-color="white"
icon-right="key"
/>
</div>
</q-form>
</q-card-section>
<q-card-actions vertical align="right">
<q-btn
@click="$refs.stepper.next()"
class="q-mb-md"
size="sm"
outline
text-color="white"
icon-right="chevron_right"
>
Skip
</q-btn>
<q-btn
@click="$refs.stepper.previous()"
size="sm"
flat
icon="chevron_left"
>
Back
</q-btn>
</q-card-actions>
</q-card>
</q-step>
<q-step
:name="7"
title="Performance"
caption=""
:done="mainWizardStep > 7"
>
<q-card
class="wizardCard"
>
<q-card-section>
<div class="text-h6 text-weight-light text-center">Enable high performance mode?</div>
<div class="text-h7 text-weight-light text-center">If you are hosting this Domain on your local computer and it is not very powerful, then consider leaving this off because the server will use more resources if it's busy, thereby slowing down your computer.
If you are running this server on a powerful system (or a remote server) and intend to have a large audience, then turn this setting on.</div>
</q-card-section>
<q-card-section>
<q-toggle
v-model="performanceMode"
checked-icon="check"
color="red"
label="Performance Mode"
unchecked-icon="clear"
/>
</q-card-section>
<q-card-actions vertical align="right">
<q-btn
@click="$refs.stepper.next()"
class="q-mb-md"
size="md"
outline
text-color="white"
icon-right="chevron_right"
>
Next
</q-btn>
<q-btn
@click="$refs.stepper.previous()"
size="sm"
flat
icon="chevron_left"
>
Back
</q-btn>
</q-card-actions>
</q-card>
</q-step>
<q-step
:name="8"
title="Done!"
caption=""
:done="mainWizardStep > 8"
>
<q-card
class="wizardCard"
>
<q-card-section>
<div class="text-h6 text-weight-light text-center">👍</div>
<div class="text-h6 text-weight-light text-center">All done! Let's get you on your way.</div>
</q-card-section>
<q-card-actions vertical align="right">
<q-btn
@click="completeWizard"
class="q-mb-md"
size="md"
outline
text-color="white"
icon-right="chevron_right"
>
Complete
</q-btn>
<q-btn
@click="$refs.stepper.previous()"
size="sm"
flat
icon="chevron_left"
>
Back
</q-btn>
</q-card-actions>
</q-card>
</q-step>
<!-- <q-step
:name="8"
title="Starter Content"
caption=""
:done="mainWizardStep > 8"
>
<q-card
class="wizardCard"
>
<q-card-section>
<div class="text-h6 text-weight-light text-center">Would you like a starter island in your Domain?</div>
<q-img
src="../../assets/hq1.jpg"
style="max-width: 400px; height: 200px;"
fit="cover"
></q-img>
</q-card-section>
<q-card-section>
<q-toggle
v-model="starterContentToggle"
checked-icon="check"
color="red"
label="Starter Content"
unchecked-icon="clear"
/>
</q-card-section>
<q-card-actions vertical align="right">
<q-btn
@click="$refs.stepper.next()"
class="q-mb-md"
size="md"
outline
text-color="white"
icon-right="chevron_right"
>
Next
</q-btn>
<q-btn
@click="$refs.stepper.previous()"
size="sm"
flat
icon="chevron_left"
>
Back
</q-btn>
</q-card-actions>
</q-card>
</q-step> -->
</q-stepper>
</transition>
</div>
@ -305,9 +587,16 @@
</template>
<script>
// FIXME: Needs to be done correctly. Also universally? Maybe window.axios?
const axios = require("axios");
const sha256 = require("js-sha256");
import { defineComponent, ref } from "vue";
// Components
import ConnectMetaverse from "../../components/dialogs/ConnectMetaverse.vue";
// Modules
import Log from "../../modules/utilities/log";
export default defineComponent({
name: "Index",
@ -324,12 +613,56 @@ export default defineComponent({
mainWizard: true,
mainWizardStep: ref(1),
// TODO: Needs to be based off of the actual state of the server's connection (using Vuex and retrieving settings on page load.)
connectMetaverseSuccess: true,
connectMetaverseSuccess: false,
connectMetaverseDialog: false,
// Security Step
administratorsListSecurityModel: [],
connectionSecurityModel: ref(["everyone"]),
connectionSecurityOptions: [
{
label: "Friends",
value: "friends"
},
{
label: "Logged In",
value: "logged-in"
},
{
label: "Everyone (anonymous)",
value: "everyone"
}
],
rezSecurityModel: ref(["friends"]),
rezSecurityOptions: [
{
label: "Friends",
value: "friends"
},
{
label: "Logged In",
value: "logged-in"
},
{
label: "Everyone (anonymous)",
value: "everyone"
}
],
// Administrator
username: "",
password: "",
confirmPassword: "",
showPassword: false,
showConfirmPassword: false,
// Performance
performanceMode: true,
// Starter Content
starterContentToggle: true,
// Consts
WELCOME_TEXT_TIMEOUT: 4000,
WELCOME_TEXT_TIMEOUT: 4500,
MAIN_WIZARD_TRANSITION_TIME: 1000,
DEFAULT_METAVERSE_URL: "https://metaverse.vircadia.com/live"
DEFAULT_METAVERSE_URL: "https://metaverse.vircadia.com/live",
FINAL_WIZARD_STEP: 8,
COMPLETE_WIZARD_REDIRECT_DELAY: 4000
};
},
@ -344,13 +677,303 @@ export default defineComponent({
this.connectMetaverseDialog = true;
},
onMetaverseConnectionAttempted () {
this.connectMetaverseSuccess = true;
onMetaverseConnectionAttempted (result) {
this.connectMetaverseDialog = false;
if (result.success === true) {
this.connectMetaverseSuccess = true;
this.mainWizardStep++;
}
},
async saveSecuritySettings () {
const friendsCanConnect = this.connectionSecurityModel.includes("friends");
const friendsCanRez = this.rezSecurityModel.includes("friends");
const loggedInCanConnect = this.connectionSecurityModel.includes("logged-in");
const loggedInCanRez = this.rezSecurityModel.includes("logged-in");
const everyoneCanConnect = this.connectionSecurityModel.includes("everyone");
const everyoneCanRez = this.rezSecurityModel.includes("everyone");
// TODO: revisit methodology here, cloud domains don't need certain overrides for example.
// However, local domain owners would.
const localhostPermissions = true;
const administratorsPermissions = [];
this.administratorsListSecurityModel.forEach((adminUsername) => {
administratorsPermissions.push({
"id_can_adjust_locks": true,
"id_can_connect": true,
"id_can_connect_past_max_capacity": true,
"id_can_get_and_set_private_user_data": true,
"id_can_kick": true,
"id_can_replace_content": true,
"id_can_rez": true,
"id_can_rez_avatar_entities": true,
"id_can_rez_certified": true,
"id_can_rez_tmp": true,
"id_can_rez_tmp_certified": true,
"id_can_write_to_asset_server": true,
"permissions_id": adminUsername
});
});
const settingsToCommit = {
"security": {
"permissions": administratorsPermissions,
"standard_permissions": [
{
"id_can_connect": everyoneCanConnect,
"id_can_rez_avatar_entities": everyoneCanConnect,
"id_can_rez": everyoneCanRez,
"id_can_rez_certified": everyoneCanRez,
"id_can_rez_tmp": everyoneCanRez,
"id_can_rez_tmp_certified": everyoneCanRez,
"permissions_id": "anonymous"
},
{
"id_can_connect": friendsCanConnect,
"id_can_rez_avatar_entities": friendsCanConnect,
"id_can_rez": friendsCanRez,
"id_can_rez_certified": friendsCanRez,
"id_can_rez_tmp": friendsCanRez,
"id_can_rez_tmp_certified": friendsCanRez,
"permissions_id": "friends"
},
{
"id_can_connect": loggedInCanConnect,
"id_can_rez_avatar_entities": loggedInCanConnect,
"id_can_rez": loggedInCanRez,
"id_can_rez_certified": loggedInCanRez,
"id_can_rez_tmp": loggedInCanRez,
"id_can_rez_tmp_certified": loggedInCanRez,
"permissions_id": "logged-in"
},
{
"id_can_adjust_locks": localhostPermissions,
"id_can_connect": localhostPermissions,
"id_can_rez_avatar_entities": localhostPermissions,
"id_can_connect_past_max_capacity": localhostPermissions,
"id_can_kick": localhostPermissions,
"id_can_replace_content": localhostPermissions,
"id_can_rez": localhostPermissions,
"id_can_rez_certified": localhostPermissions,
"id_can_rez_tmp": localhostPermissions,
"id_can_rez_tmp_certified": localhostPermissions,
"id_can_write_to_asset_server": localhostPermissions,
"permissions_id": "localhost"
}
]
}
};
const committed = await this.commitSettings(settingsToCommit);
if (committed === true) {
Log.info(Log.types.METAVERSE, "Successfully saved Domain server security settings.");
this.$q.notify({
type: "positive",
textColor: "white",
icon: "cloud_done",
message: "Successfully saved your security settings."
});
} else {
Log.error(Log.types.METAVERSE, "Failed to save Domain server security settings.");
this.$q.notify({
type: "negative",
textColor: "white",
icon: "warning",
message: "Failed to save your security settings."
});
}
// We move forward anyway, the user can come back if it fails or if they want to change it.
this.mainWizardStep++;
},
saveSecuritySettings () {
// TODO
async onAdminStepSubmit () {
const settingsToCommit = {
"security": {
"http_username": this.username,
"http_password": sha256.hex(this.confirmPassword)
}
};
const committed = await this.commitSettings(settingsToCommit);
if (committed === true) {
Log.info(Log.types.METAVERSE, "Successfully saved Domain server administrator details.");
this.$q.notify({
type: "positive",
textColor: "white",
icon: "cloud_done",
message: "Successfully saved your administrator credentials."
});
this.mainWizardStep++;
} else {
Log.error(Log.types.METAVERSE, "Failed to save Domain server administrator details.");
this.$q.notify({
type: "negative",
textColor: "white",
icon: "warning",
message: "Failed to save your administrator credentials."
});
}
},
onAdminStepReset () {
this.username = "";
this.password = "";
this.confirmPassword = "";
},
async completeWizard () {
const settingsToCommit = {
"wizard": {
"steps_completed": "0",
"completed_once": true
}
};
const committed = await this.commitSettings(settingsToCommit);
if (committed === true) {
Log.info(Log.types.METAVERSE, "Successfully saved wizard completion.");
} else {
Log.error(Log.types.METAVERSE, "Failed to save wizard completion.");
}
this.redirectToSettings();
},
redirectToSettings () {
// Needs to go somewhere universal.
const redirectURL = "/settings" + location.search;
this.firstTimeWizardDialog = false;
this.$q.loading.show({
message: "Stand by..."
});
setTimeout(() => {
location.href = redirectURL;
}, this.COMPLETE_WIZARD_REDIRECT_DELAY);
},
// TODO: This needs to go somewhere universal.
commitSettings (settingsToCommit) {
// TODO: This and all other URL endpoints should be in centralized (in their respective module) constants files.
return axios.post("/settings.json", JSON.stringify(settingsToCommit))
.then(() => {
Log.info(Log.types.DOMAIN, "Successfully committed settings.");
return true;
})
.catch((response) => {
Log.error(Log.types.DOMAIN, `Failed to commit settings to Domain: ${response}`);
return false;
});
}
// TODO: Needs to be somewhere universal. NOT TESTED.
// uploadContentChunk (file, offset, id) {
// if (offset == undefined) {
// offset = 0;
// }
// if (id == undefined) {
// // Identify this upload session
// id = Math.round(Math.random() * 2147483647);
// }
//
// const fileSize = file.size;
// const filename = file.name;
//
// const CHUNK_SIZE = 1048576; // 1 MiB
//
// const isFinal = Boolean(fileSize - offset <= CHUNK_SIZE);
// const nextChunkSize = Math.min(fileSize - offset, CHUNK_SIZE);
// const chunk = file.slice(offset, offset + nextChunkSize, file.type);
// const chunkFormData = new FormData();
//
// let formItemName = "restore-file-chunk";
// if (offset == 0) {
// formItemName = isFinal ? "restore-file-chunk-only" : "restore-file-chunk-initial";
// } else if (isFinal) {
// formItemName = "restore-file-chunk-final";
// }
//
// chunkFormData.append(formItemName, chunk, filename);
// const axiosParams = {
// url: "/content/upload",
// method: "POST",
// timeout: 30000, // 30 s
// headers: { "X-Session-Id": id },
// contentType: false,
// data: chunkFormData
// };
//
// axios.post(axiosParams)
// .then(() => {
// Log.info(Log.types.DOMAIN, "Successfully uploaded content chunk.");
// if (!isFinal) {
// this.uploadContentChunk(file, offset + CHUNK_SIZE, id);
// }
// })
// .catch((response) => {
// Log.error(Log.types.DOMAIN, `Failed to upload content chunk: ${response}`);
// });
// }
},
watch: {
async mainWizardStep () {
const settingsToCommit = {
"wizard": {
"steps_completed": this.mainWizardStep.toString()
}
};
const committed = await this.commitSettings(settingsToCommit);
if (committed === true) {
Log.info(Log.types.DOMAIN, "Successfully committed steps completed to Domain server settings.");
} else {
Log.error(Log.types.DOMAIN, "Failed to commit steps completed to Domain server settings.");
}
},
async performanceMode () {
const settingsToCommit = {
"audio_threading": {
"auto_threads": this.performanceMode
},
"avatar_mixer": {
"auto_threads": this.performanceMode
}
};
const committed = await this.commitSettings(settingsToCommit);
if (committed === true) {
Log.info(Log.types.DOMAIN, "Successfully saved performance mode setting.");
this.$q.notify({
type: "positive",
textColor: "white",
icon: "cloud_done",
message: "Successfully saved performance mode setting."
});
} else {
Log.error(Log.types.DOMAIN, "Failed to save performance mode setting.");
this.$q.notify({
type: "negative",
textColor: "white",
icon: "warning",
message: "Failed to save performance mode setting."
});
}
}
}
});

View file

@ -6,7 +6,6 @@
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
import { route } from "quasar/wrappers";
import {
createMemoryHistory,