Compare commits

..

55 commits

Author SHA1 Message Date
remy
ab545211f9 beginning german translation but oof
deepl.com is fairly reliable if you want to continue in German
especially since it's a german project
2021-04-13 08:52:46 +10:00
remy
deb82896b8 Add 'src/locales/de.json' 2021-04-13 08:47:25 +10:00
remy
5e78acec25 Update 'src/locales/fr.json' 2021-04-13 08:46:34 +10:00
remy
935a15d4e7 Update 'src/locales/fr.json' 2021-04-13 08:45:29 +10:00
remy
d6d18b16f7 Update 'src/locales/ru.json' 2021-04-12 23:46:26 +10:00
remy
e7840e6d29 Update 'src/locales/fr.json' 2021-04-12 23:10:21 +10:00
remy
d00da3abcc Update 'src/locales/fr.json' 2021-04-12 23:08:22 +10:00
remy
b238360709 Update 'src/locales/fr.json' 2021-04-12 23:08:02 +10:00
remy
4291a6da76 Update 'src/locales/fr.json' 2021-04-12 23:07:18 +10:00
remy
0dbe154251 Update 'src/locales/fr.json' 2021-04-12 23:06:59 +10:00
remy
5c5004fc23 Update 'src/locales/fr.json' 2021-04-12 23:04:29 +10:00
remy
0d0920d053 Update 'src/locales/fr.json' 2021-04-12 23:02:49 +10:00
remy
30d9653d3f fr.index.html wip 2021-04-12 22:53:29 +10:00
remy
164d8ea132 completed fr translation 2021-04-12 22:42:16 +10:00
Bytetrex
bd13de8550 more ru 2021-04-12 16:51:25 +08:00
Bytetrex
ad01903040 russian 2021-04-12 16:48:13 +08:00
Troplo
0e3d4cabeb push 2021-04-12 17:38:19 +10:00
remy
06a7fff95d Update 'src/locales/fr.json' 2021-04-12 13:08:18 +10:00
bd2826c14d Add 'src/locales/ru.json' 2021-04-12 12:34:12 +10:00
remy
62323db167 Update 'src/locales/fr.json' 2021-04-12 12:28:49 +10:00
remy
e2b53b2e72 Adding French translation, done up to line 100 2021-04-12 12:08:02 +10:00
Troplo
debcb330e1 Email Verification + Session Invalidation 2021-04-12 00:10:54 +10:00
Troplo
85dfb5f399 Fix email 2021-04-11 23:21:44 +10:00
Troplo
396ecbc434 Email changing 2021-04-11 23:14:32 +10:00
Troplo
14bb1ce69e Change debug to development
So debug options don't appear on production Canary
2021-04-11 22:32:36 +10:00
Troplo
6486cc0f11 Update SettingsSecurity.vue 2021-04-11 21:55:18 +10:00
Troplo
098459c95d Implement password changing 2021-04-11 21:50:05 +10:00
Troplo
e2aa17b738 Disable insecure 2021-04-11 16:57:56 +10:00
Troplo
596f3f9d6c Create vue.config.example.js 2021-04-11 16:40:15 +10:00
Bytetrex
351f3cd981 hi troplo 2021-04-11 14:34:56 +08:00
Troplo
5a2448b4ff Fixes 2021-04-11 16:32:17 +10:00
Troplo
2ce96638ac Update Marketplace.vue 2021-04-10 21:23:27 +10:00
Troplo
93142a1ab2 Fix random error on init 2021-04-10 18:25:52 +10:00
Troplo
40f5898cd0 Update vue.config.example.js 2021-04-10 18:12:30 +10:00
f7e5f902a9 Delete 'vue.config.js' 2021-04-10 18:11:19 +10:00
Troplo
2b93390b32 Improvements 2021-04-10 18:10:14 +10:00
Troplo
122183496e Webpack modifications 2021-04-10 16:34:51 +10:00
Troplo
9b8f478824 Update Marketplace.vue 2021-04-10 13:49:27 +10:00
Troplo
ae7b685c3e Fix avatar images 2021-04-10 13:45:51 +10:00
Troplo
a254cbe426 Avatar stuff 2021-04-10 12:37:36 +10:00
Troplo
1cae37bade Change proxy to previous API port 2021-04-09 23:33:26 +10:00
Troplo
8e151f78ef Remove register and login buttons 2021-04-09 23:32:15 +10:00
Troplo
9ec7e1c65f Update to use v2 2021-04-09 23:26:41 +10:00
Troplo
5ded3b16f0 Asset creator patch 2021-04-09 23:22:26 +10:00
Troplo
e22a63834b Update kaverti.css 2021-04-09 21:06:19 +10:00
Troplo
44123798b9 Outdated banner fix 2021-04-09 20:58:43 +10:00
Troplo
851b08bd1e Update App.vue 2021-04-09 20:38:28 +10:00
Troplo
406764ea12 Fix auth 2021-04-09 19:59:33 +10:00
Bytetrex
1f49dee177 hi 2021-04-09 16:42:56 +08:00
Bytetrex
2409e0ea0e fix 2021-04-09 15:55:42 +08:00
Bytetrex
ac76d704cb fix and friends 2021-04-09 15:49:59 +08:00
Bytetrex
73fca4ff51 muhahahhaa 2021-04-09 14:01:28 +08:00
Troplo
d45a5bd9d0 More stuff 2021-04-08 23:17:29 +10:00
Troplo
3369ee6939 Update en.json 2021-04-08 22:25:40 +10:00
Troplo
434f307f1e Merge 2021-04-08 22:20:12 +10:00
53 changed files with 3396 additions and 13352 deletions

8
.env
View file

@ -1,7 +1,9 @@
VUE_APP_APIENDPOINT=/api/ VUE_APP_API_ENDPOINT=/api/
VUE_APP_APIVERSION=v1 VUE_APP_API_VERSION=v2
VUE_APP_GATEWAYENDPOINT=/socket.io/ VUE_APP_GATEWAY_ENDPOINT=/socket.io/
VUE_APP_STAGING=true VUE_APP_STAGING=true
VUE_APP_I18N_LOCALE=en VUE_APP_I18N_LOCALE=en
VUE_APP_I18N_FALLBACK_LOCALE=en VUE_APP_I18N_FALLBACK_LOCALE=en
VUE_APP_RELEASE="Canary" VUE_APP_RELEASE="Canary"
VUE_APP_VERSION=[AIV]{version}[/AIV]
VUE_APP_BUILD_DATE=[AIV]{date}[/AIV]

View file

@ -1,5 +1,5 @@
VUE_APP_APIENDPOINT="/api/" VUE_APP_API_ENDPOINT="/api/"
VUE_APP_APIVERSION="v1" VUE_APP_API_VERSION="v2"
VUE_APP_GATEWAYENDPOINT="/socket.io/" VUE_APP_GATEWAY_ENDPOINT="/socket.io/"
VUE_APP_STAGING=true VUE_APP_STAGING=true
VUE_APP_RELEASE="Canary" VUE_APP_RELEASE="Canary"

3
.gitignore vendored
View file

@ -28,3 +28,6 @@ pnpm-debug.log*
# Yarn and NPM # Yarn and NPM
.yarn .yarn
# Vue
vue.config.js

View file

@ -1,6 +1,6 @@
{ {
"name": "kaverti-frontend", "name": "kaverti-frontend",
"version": "", "version": "1.0.0",
"private": true, "private": true,
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "serve": "vue-cli-service serve",
@ -32,7 +32,8 @@
"vue-nprogress": "^0.2.0", "vue-nprogress": "^0.2.0",
"vue-router": "^3.2.0", "vue-router": "^3.2.0",
"vue-socket.io": "^3.0.10", "vue-socket.io": "^3.0.10",
"vuex": "^3.4.0" "vuex": "^3.4.0",
"webpack-auto-inject-version": "^1.2.2"
}, },
"devDependencies": { "devDependencies": {
"@intlify/vue-i18n-loader": "^1.0.0", "@intlify/vue-i18n-loader": "^1.0.0",

41
public/fr.index.html Normal file
View file

@ -0,0 +1,41 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="/favicon.ico">
<title>Kaverti</title>
<meta name="title" content="Kaverti">
<meta name="description" content="Kaverti allows you to chat, and socialize on our platform, with our ever expanding platform, and our gaming platform will allow users to create games, and avatars with user created items from our virtual Marketplace.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://kaverti.com">
<meta property="og:title" content="Kaverti">
<meta property="og:description" content="Kaverti allows you to chat, and socialize on our platform, with our ever expanding platform, and our gaming platform will allow users to create games, and avatars with user created items from our virtual Marketplace.">
<meta property="og:image" content="https://cdn.kaverti.com/opengraph-image.png">
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://kaverti.com">
<meta property="twitter:title" content="Kaverti">
<meta property="twitter:description" content="Kaverti allows you to chat, and socialize on our platform, with our ever expanding platform, and our gaming platform will allow users to create games, and avatars with user created items from our virtual Marketplace.">
<meta property="twitter:image" content="https://cdn.kaverti.com/opengraph-image.png">
<script src="https://polyfill.io/v3/polyfill.min.js?features=es2015%2Ces2016%2Ces2018%2Ces2019%2Ces2017%2Ces6%2Ces5%2Ces7%2Cdefault%2CIntl%2Cblissfuljs"></script>
<script>
function isIE() {
ua = navigator.userAgent;
var is_ie = ua.indexOf("MSIE ") > -1 || ua.indexOf("Trident/") > -1;
return is_ie;
}
if (isIE()){
document.write('<h2>Kaverti ne supporte pas Internet Explorer et ne planifions pas de supporter le navigateur. Veuillez mettre à niveau vers un navigateur plus moderne.</h2>');
}
</script>
</head>
<body>
<noscript>
<strong>Désolé, mais Kaverti ne marche pas sans Javascript, veuillez l'activer.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

View file

@ -7,9 +7,7 @@
<Footer /> <Footer />
</div> </div>
</template> </template>
<style>
@import './assets/css/kaverti.css';
</style>
<script> <script>
import Navbar from "./components/Navbar"; import Navbar from "./components/Navbar";
import Footer from "./components/Footer"; import Footer from "./components/Footer";
@ -27,15 +25,12 @@ export default {
} }
if (JSON.parse(localStorage.getItem("wind404"))) { if (JSON.parse(localStorage.getItem("wind404"))) {
var wind = JSON.parse(localStorage.getItem("wind404")); var wind = JSON.parse(localStorage.getItem("wind404"));
} else {
// eslint-disable-next-line no-redeclare
var wind = false;
} }
this.$store.commit("setWind", wind); this.$store.commit("setWind", wind);
Object.assign(axios.defaults, { Object.assign(axios.defaults, {
headers: { Authorization: this.$store.state.user.token }, headers: { Authorization: this.$store.state.user.token },
}); });
if (this.$store.state.debug) { if (this.$store.state.client.development) {
this.$buefy.snackbar.open({ this.$buefy.snackbar.open({
message: this.$t("errors.devBuild"), message: this.$t("errors.devBuild"),
type: "is-warning", type: "is-warning",
@ -43,8 +38,8 @@ export default {
} }
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
"/" + "/" +
"userinfo" "userinfo"
) )
@ -59,18 +54,14 @@ export default {
this.$store.commit("setDescription", res.data.description); this.$store.commit("setDescription", res.data.description);
this.$store.commit("setExecutive", res.data.executive); this.$store.commit("setExecutive", res.data.executive);
}) })
.catch(() => { if (this.$store.state.user.username) {
this.$buefy.snackbar.open({
message: this.$t("errors.down"),
type: "is-warning",
});
});
this.axios.get( this.axios.get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
"/" + "/" +
"awards/eligibility" "awards/eligibility"
); )
}
}, },
}; };
</script> </script>
@ -81,5 +72,6 @@ export default {
</style> </style>
<style lang="css"> <style lang="css">
@import "./assets/css/kaverti.css";
@import "https://kit-pro.fontawesome.com/releases/v5.15.1/css/pro.min.css"; @import "https://kit-pro.fontawesome.com/releases/v5.15.1/css/pro.min.css";
</style> </style>

View file

@ -5,7 +5,11 @@
} }
main { main {
flex: 1 !important flex: 1 !important;
}
.container {
max-width: 960px !important;
} }
.large-icon { .large-icon {
@ -20,3 +24,7 @@ main {
-ms-transform: translate(-50%, -50%); -ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
} }
.navbar {
border-bottom: 2px solid #e5e5e5;
}

View file

@ -49,7 +49,7 @@ export default {
replaceLink(cached, link); replaceLink(cached, link);
} else { } else {
Vue.axios Vue.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'forums/link_preview?url=' + link.href) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'forums/link_preview?url=' + link.href)
.then(res => { .then(res => {
cache[link.href] = res.data; cache[link.href] = res.data;
replaceLink(res.data, link); replaceLink(res.data, link);

View file

@ -45,7 +45,8 @@
<b-tag v-if="system" class="is-success" rounded>{{ $t('badges.system') }}</b-tag>&nbsp; <b-tag v-if="system" class="is-success" rounded>{{ $t('badges.system') }}</b-tag>&nbsp;
<b-tag v-if="hidden" rounded>{{ $t('badges.hidden') }}</b-tag>&nbsp; <b-tag v-if="hidden" rounded>{{ $t('badges.hidden') }}</b-tag>&nbsp;
<b-tag v-if="verified" rounded><i class="fas fa-check"></i>&nbsp;Verified</b-tag> <b-tag v-if="verified" rounded><i class="fas fa-check"></i>&nbsp;Verified</b-tag>
<b-button @click="modal()" v-if="$store.state.user.admin & !noPlus" class="is-info tag" rounded><i class="fas fa-plus"></i></b-button> <b-button @click="modal(user)" v-if="$store.state.user.admin & user" class="is-info tag" rounded><i class="fas fa-plus"></i></b-button>
<b-button @click="modal(team)" v-if="$store.state.user.admin & team" class="is-info tag" rounded><i class="fas fa-plus"></i></b-button>
</span> </span>
</template> </template>
<script> <script>
@ -53,19 +54,25 @@ import AjaxErrorHandler from ".././assets/js/errorHandler";
export default { export default {
name: 'UserBadges', name: 'UserBadges',
props: ['admin', 'booster', 'bot', 'hidden', 'banned', 'system', 'username', 'noPlus', 'verified'], props: ['admin', 'booster', 'bot', 'hidden', 'banned', 'system', 'username', 'user', 'verified', 'team'],
data() { data() {
return { return {
modifyUserModal: false modifyUserModal: false
} }
}, },
methods: { methods: {
modal() { modal(type) {
if(type === 'user') {
this.modifyUserModal = true this.modifyUserModal = true
} else if(type === 'team') {
console.log('Debug: Feature not implemented')
} else {
this.modifyUserModal = true
}
}, },
modifyUser() { modifyUser() {
this.axios this.axios
.put(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'admin/user/modify', { .put(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'admin/user/modify', {
username: this.username, username: this.username,
bot: this.bot, bot: this.bot,
system: this.system, system: this.system,

View file

@ -0,0 +1,81 @@
<template>
<div class="banners">
<section
v-if="!$store.state.user.emailVerified && $store.state.user.username"
class="hero is-danger"
>
<div class="hero-body" style="padding: 1rem 1rem !important">
<div class="mobile-container">
<div class="container">
<p style="text-align: center">{{ $t("errors.emailVerify") }}</p>
</div>
</div>
</div>
</section>
<section
v-if="!$store.state.client.secure && !$store.state.client.development"
class="hero is-danger"
>
<div class="hero-body" style="padding: 1rem 1rem !important">
<div class="mobile-container">
<div class="container">
<p style="text-align: center">{{$t('errors.insecure')}}</p>
</div>
</div>
</div>
</section>
<section
v-if="
$store.state.client.clientVersion !==
$store.state.client.latestClientVersion && showOutdatedBanner && $store.state.client.latestClientVersion && !$store.state.client.development
"
class="hero is-warning"
>
<div class="hero-body" style="padding: 1rem 1rem !important">
<div class="mobile-container">
<div class="container">
<p style="text-align: center">{{$t('errors.outdated')}}<button
type="button"
class="delete"
style="float: right"
@click="showOutdatedBanner = false"
/>
</p>
</div>
</div>
</div>
</section>
</div>
</template>
<script>
export default {
name: "Banners",
data() {
return {
showOutdatedBanner: true,
showBanner: true
}
},
methods: {
toggleBrokenRoute(val) {
this.$store.commit("brokenRoute", val);
},
getBannerId() {
this.showBanner = !localStorage.getItem(this.$store.state.client.bannerId);
},
updateDismissed() {
localStorage.setItem(
"update-" + this.$store.state.client.clientVersion,
true
);
this.updateModal = false;
},
removeBannerId() {
localStorage.setItem(this.$store.state.client.bannerId, true);
this.$store.state.client.bannerEnabled = false;
console.log(localStorage.getItem(this.$store.state.client.bannerId));
},
}
}
</script>

View file

@ -4,11 +4,12 @@
<form> <form>
<div class="modal-card" style="width: auto"> <div class="modal-card" style="width: auto">
<header class="modal-card-head"> <header class="modal-card-head">
<p class="modal-card-title">{{ $t('feedback.title') }}</p> <p class="modal-card-title">{{ $t("feedback.title") }}</p>
<button <button
type="button" type="button"
class="delete" class="delete"
@click="feedbackModal = false"/> @click="feedbackModal = false"
/>
</header> </header>
<section class="modal-card-body"> <section class="modal-card-body">
<p>This feedback will be used to make Kaverti better.</p> <p>This feedback will be used to make Kaverti better.</p>
@ -16,18 +17,24 @@
<b-input <b-input
:placeholder="$store.state.user.email" :placeholder="$store.state.user.email"
v-model="feedback.email" v-model="feedback.email"
required> required
>
</b-input> </b-input>
</b-field> </b-field>
<b-field :label="$t('feedback.route')"> <b-field :label="$t('feedback.route')">
<b-input <b-input
:placeholder="$t('feedback.route')" :placeholder="$t('feedback.route')"
v-model="feedback.route" v-model="feedback.route"
required> required
>
</b-input> </b-input>
</b-field> </b-field>
<b-field :label="$t('feedback.rating')"> <b-field :label="$t('feedback.rating')">
<b-rate icon-pack="fas" v-model="feedback.stars" custom-text="Route rating"></b-rate> <b-rate
icon-pack="fas"
v-model="feedback.stars"
custom-text="Route rating"
></b-rate>
</b-field> </b-field>
<b-field :label="$t('feedback.text')"> <b-field :label="$t('feedback.text')">
<b-input <b-input
@ -35,7 +42,8 @@
v-model="feedback.text" v-model="feedback.text"
maxlength="512" maxlength="512"
type="textarea" type="textarea"
required> required
>
</b-input> </b-input>
</b-field> </b-field>
</section> </section>
@ -44,10 +52,13 @@
@click="doFeedback()" @click="doFeedback()"
:loading="feedback.loading" :loading="feedback.loading"
:label="$t('feedback.submit')" :label="$t('feedback.submit')"
type="is-primary" /> type="is-info"
></b-button>
<b-button <b-button
:label="$t('close')" :label="$t('close')"
@click="feedbackModal = false" /> @click="feedbackModal = false"
tpe="is-danger"
></b-button>
</footer> </footer>
</div> </div>
</form> </form>
@ -55,132 +66,197 @@
<b-modal v-model="langModal"> <b-modal v-model="langModal">
<div class="modal-card" style="width: auto"> <div class="modal-card" style="width: auto">
<header class="modal-card-head"> <header class="modal-card-head">
<p class="modal-card-title">{{$t('languages.title')}}</p> <p class="modal-card-title">{{ $t("languages.title") }}</p>
<button <button
type="button" type="button"
class="delete" class="delete"
@click="langModal = false"/> @click="langModal = false"
></button>
</header> </header>
<section class="modal-card-body buttons"> <section class="modal-card-body buttons">
<b-button v-if="$i18n.locale !== 'en'" @click="en" class="is-large">{{$t('languages.en')}}</b-button> <b-button
<b-button v-if="$i18n.locale === 'en'" @click="en" class="is-large is-info disabled" disabled>{{$t('languages.en')}}</b-button> @click="lang('en')"
<b-button v-if="$i18n.locale === 'wind'" @click="en" class="is-large is-info disabled" disabled>{{$t('languages.wind')}}</b-button> class="is-large"
<b-button v-if="$i18n.locale === 'debug'" @click="en" class="is-large is-info disabled" disabled>{{$t('languages.debug')}}</b-button> :disabled="$i18n.locale === 'en'"
>{{ $t("languages.en") }}</b-button
>
<b-button
@click="lang('fr')"
class="is-large"
:disabled="$i18n.locale === 'fr'"
>{{ $t("languages.fr") }}</b-button
>
<b-button
@click="lang('ru')"
class="is-large"
:disabled="$i18n.locale === 'ru'"
>{{ $t("languages.ru") }}</b-button
>
<b-button
@click="lang('nl')"
class="is-large"
:disabled="$i18n.locale === 'nl'"
>{{ $t("languages.nl") }}</b-button
>
<b-button
@click="lang('zh-cn')"
class="is-large"
:disabled="$i18n.locale === 'zh-cn'"
>{{ $t("languages.zh-cn") }}</b-button
>
<b-button
@click="lang('zh-tw')"
class="is-large"
:disabled="$i18n.locale === 'zh-tw'"
>{{ $t("languages.zh-tw") }}</b-button
>
</section> </section>
</div> </div>
</b-modal> </b-modal>
<h1>&copy; 2021 Kaverti</h1> <h1>&copy; 2021 Kaverti</h1>
<p>Version: {{$store.state.client.clientVersion}}</p>
<p>Build Date: {{$store.state.client.buildDate}}</p>
<p v-if="$store.state.client.development">!! DEVELOPMENT MODE !! {{$store.state.client.domain}}</p>
<p style="color: red" v-if="!$store.state.client.secure">!! BEING ACCESSED INSECURELY !!</p>
<p style="color: red" v-if="checkInsecure && $store.state.client.secure">!! INSECURE WARNING OVERRIDE !!</p>
<div class="buttons"> <div class="buttons">
<b-button @click="langModal = true">{{$t('languages.title')}}</b-button> <b-button class="is-danger" @click="disableInsecure()" v-if="$store.state.debug && !$store.state.client.secure && !$store.state.client.development">Debug: Disable insecure warning</b-button>
<b-button @click="feedbackModal = true">Provide Feedback</b-button> <b-button type="is-info" @click="langModal = true">{{ $t("languages.title") }}</b-button>
<b-button type="is-info" @click="feedbackModal = true">Provide Feedback</b-button>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import AjaxErrorHandler from '.././assets/js/errorHandler' import AjaxErrorHandler from ".././assets/js/errorHandler";
export default { export default {
name: 'locale-changer', name: "Footer",
data() { data() {
return { return {
feedbackModal: false, feedbackModal: false,
langs: ['en', 'debug', 'wind'], langs: ["en", "debug", "wind"],
currentLang: this.$i18n.locale, currentLang: this.$i18n.locale,
langModal: false, langModal: false,
feedback: { feedback: {
route: this.$route.path, route: this.$route.path,
stars: 0, stars: 0,
text: '', text: "",
email: this.$store.state.user.email, email: this.$store.state.user.email,
loading: false loading: false,
} },
};
},
computed: {
checkInsecure() {
return window.location.protocol === "http:";
} }
}, },
methods: { methods: {
disableInsecure() {
this.$store.commit("setSecure", true);
},
doFeedback() { doFeedback() {
this.feedback.loading = true this.feedback.loading = true;
this.axios this.axios
.post(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'feedback', { .post(
process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_API_VERSION +
"/" +
"feedback",
{
text: this.feedback.text, text: this.feedback.text,
stars: this.feedback.stars, stars: this.feedback.stars,
email: this.feedback.email, email: this.feedback.email,
route: this.feedback.route route: this.feedback.route,
}) }
)
.then(() => { .then(() => {
this.axios.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'userinfo') this.axios.get(
this.feedbackModal = false process.env.VUE_APP_API_ENDPOINT +
this.$buefy.snackbar.open({message:this.$t('errors.feedbackThanks'), type: 'is-info'}) process.env.VUE_APP_API_VERSION +
this.feedback.loading = false "/" +
}) "userinfo"
.catch(e => { );
AjaxErrorHandler(this.$store)(e) this.feedbackModal = false;
this.feedback.loading = false this.$buefy.snackbar.open({
message: this.$t("errors.feedbackThanks"),
type: "is-info",
});
this.feedback.loading = false;
}) })
.catch((e) => {
AjaxErrorHandler(this.$store)(e);
this.feedback.loading = false;
});
}, },
en () { lang(lang) {
this.$i18n.locale = "en" this.$i18n.locale = lang;
this.setLang() this.setLang();
},
debug () {
this.$i18n.locale = "debug"
this.setLang()
},
wind () {
this.$i18n.locale = "wind"
this.setLang()
}, },
setLang() { setLang() {
localStorage.setItem("lang", this.$i18n.locale); localStorage.setItem("lang", this.$i18n.locale);
this.axios this.axios
.put(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'users/preferences', { .put(
lang: this.$i18n.locale process.env.VUE_APP_API_ENDPOINT +
}) process.env.VUE_APP_API_VERSION +
.then(() => { "/" +
this.axios.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'userinfo') "users/preferences",
.then(res => { {
this.$store.commit('setUsername', res.data.username) lang: this.$i18n.locale,
this.$store.commit('setEmail', res.data.email)
this.$store.commit('setEmailVerified', res.data.emailVerified)
this.$store.commit('setAdmin', res.data.admin)
this.$store.commit('setDevMode', res.data.developerMode)
this.$store.commit('setTheme', res.data.theme)
this.$store.commit('setLang', res.data.lang)
})
})
.catch(e => {
AjaxErrorHandler(this.$store)(e)
})
} }
)
.then(() => {
this.axios
.get(
process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_API_VERSION +
"/" +
"userinfo"
)
.then((res) => {
this.$store.commit("setUsername", res.data.username);
this.$store.commit("setEmail", res.data.email);
this.$store.commit("setEmailVerified", res.data.emailVerified);
this.$store.commit("setAdmin", res.data.admin);
this.$store.commit("setDevMode", res.data.developerMode);
this.$store.commit("setTheme", res.data.theme);
this.$store.commit("setLang", res.data.lang);
});
})
.catch((e) => {
AjaxErrorHandler(this.$store)(e);
});
},
}, },
mounted() { mounted() {
if (localStorage.getItem("lang")) { if (localStorage.getItem("lang")) {
this.$i18n.locale = localStorage.getItem("lang") this.$i18n.locale = localStorage.getItem("lang");
} else if (this.$store.state.user.lang) { } else if (this.$store.state.user.lang) {
this.$i18n.locale = this.$store.state.user.lang this.$i18n.locale = this.$store.state.user.lang;
} else { } else {
this.$i18n.locale = "en" this.$i18n.locale = "en";
} }
this.$nextTick(() => { this.$nextTick(() => {
this.feedback = { this.feedback = {
route: this.$route.path, route: this.$route.path,
stars: 0, stars: 0,
text: '', text: "",
email: this.$store.state.user.email email: this.$store.state.user.email,
} };
}) });
}, },
watch: { watch: {
$route() { $route() {
this.feedback = { this.feedback = {
route: this.$route.path, route: this.$route.path,
stars: 0, stars: 0,
text: '', text: "",
email: this.$store.state.user.email email: this.$store.state.user.email,
} };
}, },
currentLang() { currentLang() {
this.setLang() this.setLang();
console.log('change') console.log("change");
} },
} },
} };
</script> </script>

File diff suppressed because it is too large Load diff

View file

@ -113,7 +113,7 @@ export default {
this.loading = true; this.loading = true;
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `users/conversations`, { params }) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + `users/conversations`, { params })
.then(res => { .then(res => {
this.loading = false; this.loading = false;
this.$store.commit('addConversations', res.data.Conversations); this.$store.commit('addConversations', res.data.Conversations);

394
src/locales/de.json Normal file
View file

@ -0,0 +1,394 @@
{
"login": {
"title": "Mit Kaverti verbinden",
"login": "Verbinden",
"loginPassword": "Bitte geben Sie Ihr Passwort ein",
"loginUsername": "Bitte geben Sie Ihren Benutzernamen oder Ihre E-Mail ein",
"doNotSaveAuth": "Anmeldeinformationen nicht speichern (Sie werden abgemeldet, wenn Sie den Browser schließen)",
"register": "Ein Konto erstellen"
},
"register": {
"title": "Kaverti Konto erstellen",
"text": "Anmelden",
"username": "Bitte geben Sie Ihren Benutzernamen ein",
"email": "Bitte geben Sie Ihre E-Mail Adresse ein",
"password": "Bitte geben Sie ein sicheres Passwort ein",
"confirm": "Bitte bestätigen Sie Ihr Passwort",
"login": "Haben Sie bereits ein Kaverti Konto?",
"agree": "Akzeptieren Sie die "
},
"teams": {
"createTeam": "Ein Team erstellen",
"joinTeam": "Werden Sie Teil des Teams",
"join": "Ansprechpartner",
"invite": "Einladen",
"viewPermissions": "Siehe die Berechtigungen der Rolle",
"devBanner": "Teams sind noch in der Entwicklung, erwarten Sie fehlende Funktionen",
"view": "Siehe",
"viewTeam": "Siehe das Team",
"memberRoles": "Mitglieder und Rollen",
"members": "Mitglieder",
"roles": "Rollen",
"items": "Erstellte Elemente",
"foundedAt": "Das Team wurde gegründet am",
"teamWall": "Mur de l'équipe",
"teamWallText": ": leur mur public",
"verified": "Équipe vérifiée",
"admin": {
"text": "Administration de l'équipe",
"nav": {
"general": "Général",
"roles": "Rôles",
"members": "Membres",
"privacy": "Paramètres de confidentialité",
"invites": "Invitations",
"forum": "Forum",
"verification": "Vérification"
},
"general": {
"title": "Général",
"name": "Nom",
"description": "Description",
"saveTeam": "Enregistrer l'équipe",
"modifyPicture": "Modifier l'avatar de l'équipe"
},
"roles": {
"title": "Rôles",
"addRole": "Ajouter un rôle",
"saveOrder": "Enregistrer l'ordre des rôles",
"modifying": "Modification",
"name": "Nom choisi pour le rôle",
"permissions": "Permissions",
"creating": "Création d'un rôle"
},
"members": {
"title": "Membres",
"modifyRoles": "Modifier les rôles utilisateurs",
"removeAllRoles": "Retirer tous les rôles de l'utilisateur"
},
"privacy": {
"title": "Confidentialité de l'Équipe",
"teamWall": "Se désabonner du mur public de l'équipe",
"disallowForum": "Révoquer les permissions du public d'écrire ou de voir le forum de l'équipe"
},
"invites": {
"title": "Invitations",
"code": "Code",
"uses": "Utilisations",
"maxUses": "Nombre d'utilisations maximal",
"createdBy": "Créées par",
"date": "Date",
"delete": "Supprimer la sélection",
"generate": "Générer une invitation"
},
"invite": {
"title": "Inviter quelqu'un dans",
"amountUses": "Nombre d'utilisations (0 est illimité)",
"role": "Veuillez sélectionner un rôle qui sera auto-assigné à l'utilisateur (optionnel)",
"refresh": "Rafraîchir",
"inviteURL": "URL d'invitation",
"domain": "https://kaverti.com/invite/"
}
},
"permissionTypes": {
"inviteUsers": "Inviter des utilisateurs",
"administrator": "Administrateur",
"modifyRoles": "Modifier les rôles, permissions ou utilisateurs",
"modifyTeamSettings": "Modifier les paramètres d'équipe",
"teamForum": "Modifier la configuration du forum de l'équipe",
"forumModerator": "Permissions de modération du forum",
"forumAdmin": "Administrateur de forum",
"submitMarketplace": "Soumettre des items sur le marché",
"priorityValue": "Configurer la valeur de priorité"
}
},
"navbar": {
"home": "Accueil",
"forums": "Forum",
"marketplace": "Marché",
"downloads": "Téléchargements",
"games": "Jeux",
"users": "Utilisateurs",
"teams": "Équipes",
"dev": {
"title": "Options développeurs",
"fakeUser": "Fausse authentification utilisateur",
"debug": "Page de debug",
"brokenRoute": "Activer les pages cassées (désactivé)"
},
"user": {
"title": "Inconnu",
"profile": "Mon Profil",
"creations": "Mes créations",
"downloads": "Téléchargements",
"avatar": "Mon avatar",
"transactions": "Transactions",
"settings": "Paramètres",
"logout": "Déconnexion",
"admin": "Administration",
"asset": "Charger un item",
"friends": "Amis"
},
"more": {
"title": "Plus",
"twitter": "Twitter",
"discord": "Discord",
"roadmap": "Feuille de route",
"documentation": "Documentation de l'API",
"stats": "Statistiques de Kaverti",
"blog": "Blog Kaverti"
},
"register": "S'enregistrer",
"login": "Se connecter"
},
"404": {
"title": "404 Introuvable",
"text": "Oh non! Vous avez probablement entré l'adresse incorrectement",
"quoteText": "There are currently 2900 WIND quotes available",
"windQuote": "WIND Quote",
"home": "Retour à l'accueil"
},
"debug": {
"title": "Mode debug activé",
"authUser": "Utilisateur authentifié",
"state": "Dump d'état",
"userState": "Dump d'état de l'utilisateur (User state dump)",
"token": "Jeton d'authentification",
"disable": "Désactiver les options de debug",
"auth": "Test d'authentification"
},
"errors": {
"authFail": "Erreur de requête, vous n'êtes pas authentifié. (L'API est-elle bloquée?)",
"devBuild": "Attention, vous utilisez une version développeur de Kaverti, attendez-vous à des instabilités",
"disableDebug": "Mode debug désactivé, vous n'aurez plus accès aux fonctionnalités développeur jusqu'à ce que vous rafraîchissez la page.",
"authSuccess": "Requête faite avec succès, votre jeton est valide, le serveur Kaverti marche correctement.",
"login": "Vous êtes maintenant connecté.",
"down": "Il semblerait qu'il y ait un problème avec Kaverti, réessayez plus tard.",
"canaryBuild": "Vous utilisez le client Canary. Si vous vous attendez à une expérience stable, veuillez utiliser le client normal sur Kaverti.com.",
"logout": "Vous êtes déconnectés de Kaverti.",
"register": "Vous êtes maintenant enregistrés sur Kaverti, bienvenue!",
"emailVerify": "Veuillez entrer votre e-mail pour vérifier votre compte",
"outdated": "Vous utilisez une version ancienne de Kaverti, veuillez rafraîchir la page.",
"insecure": "Vous accédez à Kaverti de façon non sécurisée, les fonctions d'authentification seront désactivées.",
"verifySent": "Le e-mail de vérification vient de vous être envoyé!"
},
"generic": {
"name": "Kaverti",
"loading": "Chargement",
"noItemsConnection": "Vérifiez votre connexion internet ou réessayez plus tard.",
"noItemsStart": "Il n'y a pas de",
"noItemsEnd": "à afficher.",
"adminOnly": "Seuls les administrateurs peuvent ouvrir cette page.",
"notLoggedIn": "Vous devez vous connecter pour ouvrir cette page."
},
"relationships": {
"pending": "Annuler la demande d'amitié",
"notFriends": "Envoyer la demande d'amitié",
"pendingCanAccept": "Accepter la demande d'amitié",
"accepted": "Retirer l'ami"
},
"modifyUser": {
"title": "Modifier l'utilisateur",
"text": "Modifier les badges de l'utilisateur"
},
"home": {
"globalWall": "Mur Global",
"news": "Nouvelles Kaverti"
},
"badges": {
"admin": "Admin",
"bot": "Bot",
"add": "+",
"system": "Système",
"banned": "Banni",
"hidden": "Caché",
"booster": "Boosteur Discord"
},
"user": {
"title": "Chargement",
"about": "À propos de",
"more": "Plus de",
"posts": "Messages",
"threads": "Fil",
"inventory": "Inventaire",
"awards": "Prix",
"items": "Items",
"wall": "Mur de l'utilisateur",
"description": "Description",
"created": "Enregistré le",
"defaultDesc": "Salut, je suis ",
"marketplace": "Items publié",
"relationships": "Amis",
"wearing": "Habillage",
"inventoryTab": {
"buyNow": "Acheter maintenant pour ",
"was": "était",
"unavailable": "Item n'est pas disponible",
"noItems": "Cet utilisateur n'a rien dans son inventaire!",
"onSale": "Item en vente"
}
},
"stats": {
"title": "Statistiques",
"users": "Utilisateurs enregistrés",
"purchased": "Items achetés",
"items": "Items soumis",
"posts": "Messages sur le forum",
"threads": "Fils",
"teams": "Équipes"
},
"settings": {
"title": "Paramètres utilisateur",
"menu": {
"general": "Général",
"security": "Compte et sécurité",
"experiments": "Expérimentations",
"about": "À propos",
"title": "Paramètres"
},
"general": {
"title": "Général",
"about": "À propos",
"description": "Description",
"hi": "Salut, je suis",
"saveDesc": "Enregistrer la description",
"savePref": "Enregistrer les préférences",
"preferences": "Préférences",
"devMode": "Mode développeur"
},
"security": {
"title": "Compte et sécurité",
"password": {
"title": "Changement du mot de passe",
"oldPassword": "Veuillez entrer votre mot de passe actuel",
"newPassword": "Veuillez entrer votre nouveau mot de passe",
"newPasswordConfirm": "Veuillez confirmer votre nouveau mot de passe",
"change": "Changer (Vous serez déconnecté-e)"
},
"email": {
"title": "Changement d'adresse e-amil",
"newEmail": "Entrez votre nouvelle adresse e-amil",
"change": "Changer",
"verified": "E-mail validé: ",
"verifiedTrue": "Oui",
"verifiedFalse": "Non",
"current": "Votre e-mail est: "
},
"resend": {
"resend": "Renvoyer le e-mail de validation"
},
"session": {
"title": "Se déconnecter de toutes les sessions",
"subtitle": "Ceci vous déconnectera de toutes les sessions, incluant celle-ci!",
"invalidate": "Invalider les sessions"
}
},
"privacy": {
"title": "Confidentialité"
},
"experiments": {
"title": "Expérimentations"
},
"about": {
"title": "À propos"
}
},
"languages": {
"title": "Sélecteur de langue",
"en": "English",
"wind": "Windspeak",
"fr": "Français",
"zh-cn": "简体中文",
"zh-tw": "繁體中文",
"ru": "русский",
"de": "Deutsch",
"debug": "Debug"
},
"admin": {
"title": "Administrateur Kaverti",
"dashboard": "Tableau de bord (bientôt)",
"uploadItem": "Créer un chapeau",
"executive": {
"title": "Personnel Exécutif",
"soon": "(Bientôt)"
}
},
"marketplace": {
"hats": "Chapeaux",
"faces": "Visages",
"shirts": "Chemises",
"pants": "Pantalons",
"collections": "Collections",
"moreInfo": "Plus d'informations",
"filter": "Filtres",
"search": "Chercher sur le marché"
},
"update": {
"title": "Journal des modifications"
},
"marketplaceItem": {
"moreInfo": "Informations and Statistiques",
"price": "Prix",
"originalPrice": "Prix original",
"creator": "Créateur"
},
"friends": {
"pendingCanAccept": "Demandes pour vous",
"pending": "Demandes en attente",
"accepted": "Demandes acceptées"
},
"feedback": {
"title": "Feedback pour le site",
"email": "Votre email:",
"route": "Page pour laquelle vous voulez soumettre votre avis:",
"rating": "Cote",
"text": "Comment pouvons-nous nous améliorer?",
"submit": "Soumettre"
},
"guided": {
"registration": {
"title": "Bienvenue chez Kaverti",
"desc": "Commencons...",
"account": "Compte",
"information": "Information",
"customization": "Personnalisation",
"finish": "Finir",
"continue": "Continuer",
"init": {
"login": "Connexion"
},
"info": {
"description": "Votre description choisie:",
"placeholder": "Dites quelque chose d'intéressant à propos de vous."
},
"customize": {
"light": "Illuminé",
"dark": "Sombre",
"amoled": "AMOLED",
"highContrast": "Haut Contraste",
"theme": "Choisissez votre thème préféré:"
},
"finishing": {
"home": "Commencer à utiliser Kaverti"
}
},
"tCreate": {
}
},
"avatar": {
"reRender": "Regénérer l'avatar",
"hats": "Chapeaux",
"faces": "Visages",
"shirts": "Chemises",
"pants": "Pantalons",
"collections": "Collections",
"debug": "Debug"
},
"currency": "Koins",
"close": "Annuler",
"tos": "Conditions d'utilisation",
"gotIt": "D'accord, j'accepte",
"OK": "OK",
"errorModalTitle": "Une erreur est survenue..."
}

View file

@ -1,3 +0,0 @@
{
"message": "hello i18n !!"
}

View file

@ -126,6 +126,7 @@
"settings": "Settings", "settings": "Settings",
"logout": "Logout", "logout": "Logout",
"admin": "Admin", "admin": "Admin",
"asset": "Item Upload",
"friends": "Friends" "friends": "Friends"
}, },
"more": { "more": {
@ -166,7 +167,10 @@
"canaryBuild": "You are using the Canary client, if you are expecting a stable experience, please use the regular one on Kaverti.com.", "canaryBuild": "You are using the Canary client, if you are expecting a stable experience, please use the regular one on Kaverti.com.",
"logout": "You have been logged out of Kaverti.", "logout": "You have been logged out of Kaverti.",
"register": "You have been registered to Kaverti, Welcome!", "register": "You have been registered to Kaverti, Welcome!",
"emailVerify": "Please verify your email to get full access to Kaverti!" "emailVerify": "Please verify your email to get full access to Kaverti!",
"outdated": "You are using an outdated version of Kaverti, please refresh.",
"insecure": "You are accessing Kaverti insecurely, authentication features will be disabled for security.",
"verifySent": "Email address verification email has been sent!"
}, },
"generic": { "generic": {
"name": "Kaverti", "name": "Kaverti",
@ -174,7 +178,8 @@
"noItemsConnection": "Please check your internet connection, or try again later.", "noItemsConnection": "Please check your internet connection, or try again later.",
"noItemsStart": "There are no", "noItemsStart": "There are no",
"noItemsEnd": "to display.", "noItemsEnd": "to display.",
"adminOnly": "Only users with admin are allowed to navigate to this route." "adminOnly": "Only users with admin are allowed to navigate to this route.",
"notLoggedIn": "You have to login to access this route."
}, },
"relationships": { "relationships": {
"pending": "Cancel Friend Request", "pending": "Cancel Friend Request",
@ -234,18 +239,49 @@
}, },
"settings": { "settings": {
"title": "User Settings", "title": "User Settings",
"menu": {
"general": "General",
"security": "Account & Security",
"experiments": "Experiments",
"about": "About",
"title": "Settings"
},
"general": { "general": {
"title": "General", "title": "General",
"about": "About", "about": "About",
"description": "Your description", "description": "Description",
"hi": "Hi, I'm", "hi": "Hi, I'm",
"saveDesc": "Save description", "saveDesc": "Save Description",
"savePref": "Save preferences", "savePref": "Save Preferences",
"preferences": "Preferences", "preferences": "Preferences",
"devMode": "Developer mode" "devMode": "Developer Mode"
}, },
"security": { "security": {
"title": "Security" "title": "Account & Security",
"password": {
"title": "Changing your password",
"oldPassword": "Please enter your existing password",
"newPassword": "Please enter your new desired password",
"newPasswordConfirm": "Please re-enter your desired password",
"change": "Change password (You will be logged out)"
},
"email": {
"title": "Change email address",
"newEmail": "Enter your new email address",
"change": "Change",
"verified": "Email Verified: ",
"verifiedTrue": "Yes",
"verifiedFalse": "No",
"current": "Your email is: "
},
"resend": {
"resend": "Resend Email Verification"
},
"session": {
"title": "Invalidate all sessions",
"subtitle": "Using this feature will log you out of all devices, including this one!",
"invalidate": "Invalidate sessions"
}
}, },
"privacy": { "privacy": {
"title": "Privacy" "title": "Privacy"
@ -260,7 +296,12 @@
"languages": { "languages": {
"title": "Locale Selector", "title": "Locale Selector",
"en": "English", "en": "English",
"nl": "Nederlands",
"wind": "Windspeak", "wind": "Windspeak",
"fr": "Français",
"zh-cn": "简体中文",
"zh-tw": "繁體中文",
"ru": "русский",
"debug": "Debug" "debug": "Debug"
}, },
"admin": { "admin": {
@ -317,14 +358,16 @@
"login": "Login" "login": "Login"
}, },
"info": { "info": {
"description": "Your chosen description:" "description": "Your chosen description:",
"placeholder": "Say something interesting about yourself."
}, },
"customize": { "customize": {
"light": "Light", "light": "Light",
"dark": "Dark", "dark": "Dark",
"amoled": "AMOLED", "amoled": "AMOLED",
"highContrast": "High Contrast", "highContrast": "High Contrast",
"theme": "Select your preferred theme:" "theme": "Select your preferred theme:",
"themeWarning": "Themes are currently coming soon, your selected theme will apply when they are added."
}, },
"finishing": { "finishing": {
"home": "Start using Kaverti" "home": "Start using Kaverti"
@ -333,8 +376,17 @@
"tCreate": { "tCreate": {
} }
}, },
"avatar": {
"reRender": "Re-render avatar",
"hats": "Hats",
"faces": "Faces",
"shirts": "Shirts",
"pants": "Pants",
"collections": "Collections",
"debug": "Debug"
},
"currency": "Koins", "currency": "Koins",
"close": "Close", "close": "Cancel",
"tos": "Terms of Service", "tos": "Terms of Service",
"gotIt": "Got it!", "gotIt": "Got it!",
"OK": "OK", "OK": "OK",

394
src/locales/fr.json Normal file
View file

@ -0,0 +1,394 @@
{
"login": {
"title": "Se connecter à Kaverti",
"login": "Connexion",
"loginPassword": "Veuillez entrer votre mot de passe",
"loginUsername": "Veuillez entrer votre nom d'utilisateur ou e-mail",
"doNotSaveAuth": "Ne pas enregistrer les informations de connexion (vous serez déconnecté lorsque vous fermerez le navigateur)",
"register": "Se créer un compte"
},
"register": {
"title": "Créer un compte Kaverti",
"text": "S'inscrire",
"username": "Veuillez entrer votre nom d'utilisateur",
"email": "Veuillez entrer votre e-mail",
"password": "Veuillez entrer un mot de passe sécuritaire",
"confirm": "Veuillez confirmer votre mot de passe",
"login": "Avez-vous déjà un compte Kaverti?",
"agree": "Acceptez-vous les "
},
"teams": {
"createTeam": "Créer une équipe",
"joinTeam": "Joindre l'équipe",
"join": "Joindre",
"invite": "Inviter",
"viewPermissions": "Voir les permissions du rôle",
"devBanner": "Les équipes sont encore en développement, attendez-vous à des fonctionnalités manquantes",
"view": "Voir",
"viewTeam": "Voir l'équipe",
"memberRoles": "Membres et rôles",
"members": "Membres",
"roles": "Rôles",
"items": "Items crées",
"foundedAt": "L'équipe a été fondée le",
"teamWall": "Mur de l'équipe",
"teamWallText": ": leur mur public",
"verified": "Équipe vérifiée",
"admin": {
"text": "Administration de l'équipe",
"nav": {
"general": "Général",
"roles": "Rôles",
"members": "Membres",
"privacy": "Paramètres de confidentialité",
"invites": "Invitations",
"forum": "Forum",
"verification": "Vérification"
},
"general": {
"title": "Général",
"name": "Nom",
"description": "Description",
"saveTeam": "Enregistrer l'équipe",
"modifyPicture": "Modifier l'avatar de l'équipe"
},
"roles": {
"title": "Rôles",
"addRole": "Ajouter un rôle",
"saveOrder": "Enregistrer l'ordre des rôles",
"modifying": "Modification",
"name": "Nom choisi pour le rôle",
"permissions": "Permissions",
"creating": "Création d'un rôle"
},
"members": {
"title": "Membres",
"modifyRoles": "Modifier les rôles utilisateurs",
"removeAllRoles": "Retirer tous les rôles de l'utilisateur"
},
"privacy": {
"title": "Confidentialité de l'Équipe",
"teamWall": "Se désabonner du mur public de l'équipe",
"disallowForum": "Révoquer les permissions du public d'écrire ou de voir le forum de l'équipe"
},
"invites": {
"title": "Invitations",
"code": "Code",
"uses": "Utilisations",
"maxUses": "Nombre d'utilisations maximal",
"createdBy": "Créées par",
"date": "Date",
"delete": "Supprimer la sélection",
"generate": "Générer une invitation"
},
"invite": {
"title": "Inviter quelqu'un dans",
"amountUses": "Nombre d'utilisations (0 est illimité)",
"role": "Veuillez sélectionner un rôle qui sera auto-assigné à l'utilisateur (optionnel)",
"refresh": "Rafraîchir",
"inviteURL": "URL d'invitation",
"domain": "https://kaverti.com/invite/"
}
},
"permissionTypes": {
"inviteUsers": "Inviter des utilisateurs",
"administrator": "Administrateur",
"modifyRoles": "Modifier les rôles, permissions ou utilisateurs",
"modifyTeamSettings": "Modifier les paramètres d'équipe",
"teamForum": "Modifier la configuration du forum de l'équipe",
"forumModerator": "Permissions de modération du forum",
"forumAdmin": "Administrateur de forum",
"submitMarketplace": "Soumettre des items sur le marché",
"priorityValue": "Configurer la valeur de priorité"
}
},
"navbar": {
"home": "Accueil",
"forums": "Forum",
"marketplace": "Marché",
"downloads": "Téléchargements",
"games": "Jeux",
"users": "Utilisateurs",
"teams": "Équipes",
"dev": {
"title": "Options développeurs",
"fakeUser": "Fausse authentification utilisateur",
"debug": "Page de debug",
"brokenRoute": "Activer les pages cassées (désactivé)"
},
"user": {
"title": "Inconnu",
"profile": "Mon Profil",
"creations": "Mes créations",
"downloads": "Téléchargements",
"avatar": "Mon avatar",
"transactions": "Transactions",
"settings": "Paramètres",
"logout": "Déconnexion",
"admin": "Administration",
"asset": "Charger un item",
"friends": "Amis"
},
"more": {
"title": "Plus",
"twitter": "Twitter",
"discord": "Discord",
"roadmap": "Feuille de route",
"documentation": "Documentation de l'API",
"stats": "Statistiques de Kaverti",
"blog": "Blog Kaverti"
},
"register": "S'enregistrer",
"login": "Se connecter"
},
"404": {
"title": "404 Introuvable",
"text": "Oh non! Vous avez probablement entré l'adresse incorrectement",
"quoteText": "There are currently 2900 WIND quotes available",
"windQuote": "WIND Quote",
"home": "Retour à l'accueil"
},
"debug": {
"title": "Mode debug activé",
"authUser": "Utilisateur authentifié",
"state": "Dump d'état",
"userState": "Dump d'état de l'utilisateur (User state dump)",
"token": "Jeton d'authentification",
"disable": "Désactiver les options de debug",
"auth": "Test d'authentification"
},
"errors": {
"authFail": "Erreur de requête, vous n'êtes pas authentifié. (L'API est-elle bloquée?)",
"devBuild": "Attention, vous utilisez une version développeur de Kaverti, attendez-vous à des instabilités",
"disableDebug": "Mode debug désactivé, vous n'aurez plus accès aux fonctionnalités développeur jusqu'à ce que vous rafraîchissez la page.",
"authSuccess": "Requête faite avec succès, votre jeton est valide, le serveur Kaverti marche correctement.",
"login": "Vous êtes maintenant connecté.",
"down": "Il semblerait qu'il y ait un problème avec Kaverti, réessayez plus tard.",
"canaryBuild": "Vous utilisez le client Canary. Si vous vous attendez à une expérience stable, veuillez utiliser le client normal sur Kaverti.com.",
"logout": "Vous êtes déconnectés de Kaverti.",
"register": "Vous êtes maintenant enregistrés sur Kaverti, bienvenue!",
"emailVerify": "Veuillez entrer votre e-mail pour vérifier votre compte",
"outdated": "Vous utilisez une version ancienne de Kaverti, veuillez rafraîchir la page.",
"insecure": "Vous accédez à Kaverti de façon non sécurisée, les fonctions d'authentification seront désactivées.",
"verifySent": "Le e-mail de vérification vient de vous être envoyé!"
},
"generic": {
"name": "Kaverti",
"loading": "Chargement",
"noItemsConnection": "Vérifiez votre connexion internet ou réessayez plus tard.",
"noItemsStart": "Il n'y a pas de",
"noItemsEnd": "à afficher.",
"adminOnly": "Seuls les administrateurs peuvent ouvrir cette page.",
"notLoggedIn": "Vous devez vous connecter pour ouvrir cette page."
},
"relationships": {
"pending": "Annuler la demande d'amitié",
"notFriends": "Envoyer la demande d'amitié",
"pendingCanAccept": "Accepter la demande d'amitié",
"accepted": "Retirer l'ami"
},
"modifyUser": {
"title": "Modifier l'utilisateur",
"text": "Modifier les badges de l'utilisateur"
},
"home": {
"globalWall": "Mur Global",
"news": "Nouvelles Kaverti"
},
"badges": {
"admin": "Admin",
"bot": "Bot",
"add": "+",
"system": "Système",
"banned": "Banni",
"hidden": "Caché",
"booster": "Boosteur Discord"
},
"user": {
"title": "Chargement",
"about": "À propos de",
"more": "Plus de",
"posts": "Messages",
"threads": "Fil",
"inventory": "Inventaire",
"awards": "Prix",
"items": "Items",
"wall": "Mur de l'utilisateur",
"description": "Description",
"created": "Enregistré le",
"defaultDesc": "Salut, je suis ",
"marketplace": "Items publié",
"relationships": "Amis",
"wearing": "Habillage",
"inventoryTab": {
"buyNow": "Acheter maintenant pour ",
"was": "était",
"unavailable": "Item n'est pas disponible",
"noItems": "Cet utilisateur n'a rien dans son inventaire!",
"onSale": "Item en vente"
}
},
"stats": {
"title": "Statistiques",
"users": "Utilisateurs enregistrés",
"purchased": "Items achetés",
"items": "Items soumis",
"posts": "Messages sur le forum",
"threads": "Fils",
"teams": "Équipes"
},
"settings": {
"title": "Paramètres utilisateur",
"menu": {
"general": "Général",
"security": "Compte et sécurité",
"experiments": "Expérimentations",
"about": "À propos",
"title": "Paramètres"
},
"general": {
"title": "Général",
"about": "À propos",
"description": "Description",
"hi": "Salut, je suis",
"saveDesc": "Enregistrer la description",
"savePref": "Enregistrer les préférences",
"preferences": "Préférences",
"devMode": "Mode développeur"
},
"security": {
"title": "Compte et sécurité",
"password": {
"title": "Changement du mot de passe",
"oldPassword": "Veuillez entrer votre mot de passe actuel",
"newPassword": "Veuillez entrer votre nouveau mot de passe",
"newPasswordConfirm": "Veuillez confirmer votre nouveau mot de passe",
"change": "Changer (Vous serez déconnecté-e)"
},
"email": {
"title": "Changement d'adresse e-amil",
"newEmail": "Entrez votre nouvelle adresse e-amil",
"change": "Changer",
"verified": "E-mail validé: ",
"verifiedTrue": "Oui",
"verifiedFalse": "Non",
"current": "Votre e-mail est: "
},
"resend": {
"resend": "Renvoyer le e-mail de validation"
},
"session": {
"title": "Se déconnecter de toutes les sessions",
"subtitle": "Ceci vous déconnectera de toutes les sessions, incluant celle-ci!",
"invalidate": "Invalider les sessions"
}
},
"privacy": {
"title": "Confidentialité"
},
"experiments": {
"title": "Expérimentations"
},
"about": {
"title": "À propos"
}
},
"languages": {
"title": "Sélecteur de langue",
"en": "English",
"wind": "Windspeak",
"fr": "Français",
"zh-cn": "简体中文",
"zh-tw": "繁體中文",
"ru": "русский",
"de": "Deutsch",
"debug": "Debug"
},
"admin": {
"title": "Administrateur Kaverti",
"dashboard": "Tableau de bord (bientôt)",
"uploadItem": "Créer un chapeau",
"executive": {
"title": "Personnel Exécutif",
"soon": "(Bientôt)"
}
},
"marketplace": {
"hats": "Chapeaux",
"faces": "Visages",
"shirts": "Chemises",
"pants": "Pantalons",
"collections": "Collections",
"moreInfo": "Plus d'informations",
"filter": "Filtres",
"search": "Chercher sur le marché"
},
"update": {
"title": "Journal des modifications"
},
"marketplaceItem": {
"moreInfo": "Informations and Statistiques",
"price": "Prix",
"originalPrice": "Prix original",
"creator": "Créateur"
},
"friends": {
"pendingCanAccept": "Demandes pour vous",
"pending": "Demandes en attente",
"accepted": "Demandes acceptées"
},
"feedback": {
"title": "Feedback pour le site",
"email": "Votre email:",
"route": "Page pour laquelle vous voulez soumettre votre avis:",
"rating": "Cote",
"text": "Comment pouvons-nous nous améliorer?",
"submit": "Soumettre"
},
"guided": {
"registration": {
"title": "Bienvenue chez Kaverti",
"desc": "Commencons...",
"account": "Compte",
"information": "Information",
"customization": "Personnalisation",
"finish": "Finir",
"continue": "Continuer",
"init": {
"login": "Connexion"
},
"info": {
"description": "Votre description choisie:",
"placeholder": "Dites quelque chose d'intéressant à propos de vous."
},
"customize": {
"light": "Illuminé",
"dark": "Sombre",
"amoled": "AMOLED",
"highContrast": "Haut Contraste",
"theme": "Choisissez votre thème préféré:"
},
"finishing": {
"home": "Commencer à utiliser Kaverti"
}
},
"tCreate": {
}
},
"avatar": {
"reRender": "Regénérer l'avatar",
"hats": "Chapeaux",
"faces": "Visages",
"shirts": "Chemises",
"pants": "Pantalons",
"collections": "Collections",
"debug": "Debug"
},
"currency": "Koins",
"close": "Annuler",
"tos": "Conditions d'utilisation",
"gotIt": "D'accord, j'accepte",
"OK": "OK",
"errorModalTitle": "Une erreur est survenue..."
}

393
src/locales/ru.json Normal file
View file

@ -0,0 +1,393 @@
{
"login": {
"title": "Войти в Kaverti",
"login": "Авторизоваться",
"loginPassword": "Пожалуйста, введите пароль",
"loginUsername": "Пожалуйста, введите ваше имя пользователя или адрес электронной почты",
"doNotSaveAuth": "Не сохранять токен в браузере (выйдет из системы при обновлении)",
"register": "Нет учетной записи?"
},
"register": {
"title": "Зарегистрируйтесь на Kaverti",
"text": "регистр",
"username": "Пожалуйста, введите имя пользователя",
"email": "Пожалуйста, введите ваш действующий адрес электронной почты",
"password": "Пожалуйста, введите надежный пароль",
"confirm": "Пожалуйста, введите надежный пароль еще раз",
"login": "Уже есть аккаунт?",
"agree": "Вы согласны с "
},
"teams": {
"createTeam": "Создать группу",
"joinTeam": "Вступить в группу",
"join": "Присоединиться",
"invite": "Приглашать",
"viewPermissions": "Просмотр разрешений ролей",
"devBanner": "Teams are currently in development, expect missing features.",
"view": "Посмотрите",
"viewTeam": "Посмотрите группу",
"memberRoles": "Члены группы и роли",
"members": "Члены группы",
"roles": "Роли",
"items": "Созданные предметы",
"foundedAt": "Группа была основана в ",
"teamWall": "Team Wall",
"teamWallText": "'s Team Wall",
"verified": "Проверенная группа",
"admin": {
"text": "Групповое администрирование",
"nav": {
"general": "Общий",
"roles": "Роли",
"members": "Члены группы",
"privacy": "Конфиденциальность",
"invites": "Приглашает",
"forum": "Форум",
"verification": "Проверка"
},
"general": {
"title": "Общий",
"name": "Имя",
"description": "Описание",
"saveTeam": "Сохранить группу",
"modifyPicture": "Modify Team avatar"
},
"roles": {
"title": "Роли",
"addRole": "Добавить роль",
"saveOrder": "Сохранить порядок ролей",
"modifying": "Изменение",
"name": "Выбранное название роли",
"permissions": "Разрешения",
"creating": "Создание роли"
},
"members": {
"title": "Члены группы",
"modifyRoles": "Изменить роли пользователей",
"removeAllRoles": "Удалить все роли с пользователя"
},
"privacy": {
"title": "Конфиденциальность группы",
"teamWall": "Отказаться от групповых стен",
"disallowForum": "Запретить кому-либо просматривать / создавать на форуме вашей группы"
},
"invites": {
"title": "Приглашает",
"code": "Код",
"uses": "Использует",
"maxUses": "Максимальное использование",
"createdBy": "Создано",
"date": "Дата",
"delete": "Удалить выбранное",
"generate": "Создать приглашение"
},
"invite": {
"title": "Пригласите людей в",
"amountUses": "Количество использований (0 не ограничено)",
"role": "Выберите роль, которую следует автоматически назначить пользователю (необязательно)",
"refresh": "Обновить",
"inviteURL": "URL приглашения",
"domain": "https://kaverti.com/invite/"
}
},
"permissionTypes": {
"inviteUsers": "Пригласить пользователей",
"administrator": "Администратор",
"modifyRoles": "Изменить роли / разрешения / пользователей",
"modifyTeamSettings": "Изменить настройки группы",
"teamForum": "Изменить конфигурацию форума группы",
"forumModerator": "Разрешения на модерацию форума",
"forumAdmin": "Администратор форума",
"submitMarketplace": "Отправьте товар на торговую площадку",
"priorityValue": "Установить значение приоритета"
}
},
"navbar": {
"home": "главная страница",
"forums": "Форум",
"marketplace": "магазин",
"downloads": "Загрузки",
"games": "Игры",
"users": "Пользователи",
"teams": "Группы",
"dev": {
"title": "Параметры разработчика",
"fakeUser": "Поддельная аутентификация пользователя",
"debug": "Страница отладки",
"brokenRoute": "Включить битые (отключенные) страницы"
},
"user": {
"title": "Неизвестный",
"profile": "Мой профиль",
"creations": "Мои творения",
"downloads": "Загрузки",
"avatar": "Мой аватар",
"transactions": "Сделки",
"settings": "Настройки",
"logout": "Выйти",
"admin": "Админ",
"asset": "загрузить одежду",
"friends": "Друзья"
},
"more": {
"title": "More",
"twitter": "Twitter",
"discord": "Discord",
"roadmap": "Roadmap",
"documentation": "API Docs",
"stats": "Kaverti Stats",
"blog": "Kaverti Blog"
},
"register": "Register",
"login": "Login"
},
"404": {
"title": "404 Not Found",
"text": "Oh uh! You must've entered the address wrong!",
"quoteText": "There is currently 2900 WIND quotes available",
"windQuote": "WIND Quote",
"home": "Go Home"
},
"debug": {
"title": "Debug mode enabled",
"authUser": "Authenticated user",
"state": "State dump",
"userState": "User state dump",
"token": "Auth token in state",
"disable": "Disable debug options",
"auth": "Test authentication"
},
"errors": {
"authFail": "Request failed, you are not authenticated. (Is API blocked?)",
"devBuild": "Warning: You are using a development build of Kaverti, expect instabilities.",
"disableDebug": "Debug mode disabled, you will no longer have access to development features until you refresh.",
"authSuccess": "Request successful, your token is valid, and the Kaverti server instance is running correctly.",
"login": "You have been logged into Kaverti.",
"down": "There has appeared to be an issue communicating with Kaverti, please try again later.",
"canaryBuild": "You are using the Canary client, if you are expecting a stable experience, please use the regular one on Kaverti.com.",
"logout": "You have been logged out of Kaverti.",
"register": "You have been registered to Kaverti, Welcome!",
"emailVerify": "Please verify your email to get full access to Kaverti!",
"outdated": "You are using an outdated version of Kaverti, please refresh.",
"insecure": "You are accessing Kaverti insecurely, authentication features will be disabled for security.",
"verifySent": "Email address verification email has been sent!"
},
"generic": {
"name": "Kaverti",
"loading": "Loading",
"noItemsConnection": "Please check your internet connection, or try again later.",
"noItemsStart": "There are no",
"noItemsEnd": "to display.",
"adminOnly": "Only users with admin are allowed to navigate to this route.",
"notLoggedIn": "You have to login to access this route."
},
"relationships": {
"pending": "Cancel Friend Request",
"notFriends": "Send Friend Request",
"pendingCanAccept": "Accept Friend Request",
"accepted": "Remove friend"
},
"modifyUser": {
"title": "Modify User",
"text": "Modify user badges"
},
"home": {
"globalWall": "Global Wall",
"news": "Kaverti News"
},
"badges": {
"admin": "Admin",
"bot": "Bot",
"add": "+",
"system": "System",
"banned": "Banned",
"hidden": "Hidden",
"booster": "Discord Booster"
},
"user": {
"title": "Loading",
"about": "About",
"more": "More of",
"posts": "Posts",
"threads": "Threads",
"inventory": "Inventory",
"awards": "Awards",
"items": "Items",
"wall": "User Wall",
"description": "Description",
"created": "Registered at",
"defaultDesc": "Hi, I'm ",
"marketplace": "Published items",
"relationships": "Friends",
"wearing": "Wearing",
"inventoryTab": {
"buyNow": "Buy now for ",
"was": "was",
"unavailable": "Item is unavailable",
"noItems": "У этого пользователя еще нет товаров в инвентаре!",
"onSale": "Item is on sale"
}
},
"stats": {
"title": "Stats",
"users": "Registered users",
"purchased": "Purchased items",
"items": "Uploaded items",
"posts": "Forum posts",
"threads": "Threads",
"teams": "Teams"
},
"settings": {
"title": "User Settings",
"menu": {
"general": "General",
"security": "Account & Security",
"experiments": "Experiments",
"about": "About",
"title": "Settings"
},
"general": {
"title": "General",
"about": "About",
"description": "Description",
"hi": "Hi, I'm",
"saveDesc": "Save Description",
"savePref": "Save Preferences",
"preferences": "Preferences",
"devMode": "Developer Mode"
},
"security": {
"title": "Security",
"password": {
"title": "Changing your password",
"oldPassword": "Please enter your existing password",
"newPassword": "Please enter your new desired password",
"newPasswordConfirm": "Please re-enter your desired password",
"change": "Change password (You will be logged out)"
},
"email": {
"title": "Change email address",
"newEmail": "Enter your new email address",
"change": "Change",
"verified": "Email Verified: ",
"verifiedTrue": "Yes",
"verifiedFalse": "No",
"current": "Your email is: "
},
"resend": {
"resend": "Resend Email Verification"
},
"session": {
"title": "Invalidate all sessions",
"subtitle": "Using this feature will log you out of all devices, including this one!",
"invalidate": "Invalidate sessions"
}
},
"privacy": {
"title": "Privacy"
},
"experiments": {
"title": "Experiments"
},
"about": {
"title": "About"
}
},
"languages": {
"title": "Locale Selector",
"en": "English",
"nl": "Nederlands",
"wind": "Windspeak",
"fr": "Français",
"zh-cn": "简体中文",
"zh-tw": "繁體中文",
"ru": "русский",
"debug": "Debug"
},
"admin": {
"title": "Kaverti Admin",
"dashboard": "Dashboard (SOON)",
"uploadItem": "Create Hat",
"executive": {
"title": "Executive Staff",
"soon": "(SOON)"
}
},
"marketplace": {
"hats": "Hats",
"faces": "Faces",
"shirts": "Shirts",
"pants": "Pants",
"collections": "Collections",
"moreInfo": "More info",
"filter": "Filters",
"search": "Search the Marketplace"
},
"update": {
"title": "Changelog for new update"
},
"marketplaceItem": {
"moreInfo": "Information and Stats",
"price": "Price",
"originalPrice": "Original Price",
"creator": "The Creator"
},
"friends": {
"pendingCanAccept": "Requests to you",
"pending": "Requests from you",
"accepted": "Accepted requests"
},
"feedback": {
"title": "Route Feedback",
"email": "Email we can get back to you with:",
"route": "Route you are providing feedback for:",
"rating": "Rating",
"text": "How can we improve?",
"submit": "Submit"
},
"guided": {
"registration": {
"title": "Welcome to Kaverti",
"desc": "Let's get started...",
"account": "Account",
"information": "Info",
"customization": "Customization",
"finish": "Finish",
"continue": "Continue",
"init": {
"login": "Login"
},
"info": {
"description": "Your chosen description:",
"placeholder": "Say something interesting about yourself."
},
"customize": {
"light": "Light",
"dark": "Dark",
"amoled": "AMOLED",
"highContrast": "High Contrast",
"theme": "Select your preferred theme:"
},
"finishing": {
"home": "Start using Kaverti"
}
},
"tCreate": {
}
},
"avatar": {
"reRender": "Re-render avatar",
"hats": "Hats",
"faces": "Faces",
"shirts": "Shirts",
"pants": "Pants",
"collections": "Collections",
"debug": "Debug"
},
"currency": "Koins",
"close": "Cancel",
"tos": "Terms of Service",
"gotIt": "Got it!",
"OK": "OK",
"errorModalTitle": "Something went wrong..."
}

View file

@ -1,203 +0,0 @@
{
"404": {
"title": "systemctl start httpd??",
"text": "Error 521 Ray ID: 4f3226667865dc3b how to fix",
"quoteText": "There is currently 2900 WIND quotes available",
"windQuote": "without https works",
"home": "£1m"
},
"login": {
"title": "dont tell anyone the new domain",
"login": "im never firing you btw your my best friend xzd xd",
"loginPassword": "I mean cyrex would still have the £75 but I'll give user it back bit by bit",
"loginUsername": "u wanna help now?",
"doNotSaveAuth": "yo yo",
"register": "Don't have an account?"
},
"register": {
"title": "no I am not, I am wlnd, aka Alex",
"text": "i just need the phpmyadmin login details",
"username": "honestly go fuck yourself",
"email": "this is fucking dumb",
"password": "would mind doing me a favour",
"confirm": "dont tell anyone",
"login": "can i get my twitter handle back lol",
"agree": "Price has been reduced to £10 "
},
"teams": {
"createTeam": "Create Team",
"joinTeam": "Join Team",
"join": "Join",
"invite": "Invite",
"viewPermissions": "View role permissions",
"devBanner": "Teams are currently in development, expect missing features.",
"view": "View",
"viewTeam": "View Team",
"memberRoles": "Members and Roles",
"members": "Members",
"roles": "Roles",
"items": "Created Items",
"foundedAt": "Team was founded at",
"teamWall": "Team Wall",
"teamWallText": "'s Team Wall",
"verified": "Verified Team",
"admin": {
"text": "Team Administration",
"nav": {
"general": "General",
"roles": "Roles",
"members": "Members",
"privacy": "Privacy",
"invites": "Invites",
"forum": "Forum",
"verification": "Verification"
},
"general": {
"title": "General",
"name": "Name",
"description": "Description",
"saveTeam": "Save Team",
"modifyPicture": "Modify Team avatar"
},
"roles": {
"title": "Roles",
"addRole": "Add Role",
"saveOrder": "Save role order",
"modifying": "Modifying",
"name": "Chosen role name",
"permissions": "Permissions",
"creating": "Creating a role"
},
"members": {
"title": "Members",
"modifyRoles": "Modify user roles",
"removeAllRoles": "Remove all roles from user"
},
"privacy": {
"title": "Team Privacy",
"teamWall": "Opt out of team walls",
"disallowForum": "Disallow anyone from viewing/creating on your Team Forum"
},
"invites": {
"title": "Invites",
"code": "Code",
"uses": "Uses",
"maxUses": "Max Uses",
"createdBy": "Created by",
"date": "Date",
"delete": "Delete selected",
"generate": "Generate invite"
},
"invite": {
"title": "Invite people to",
"amountUses": "Amount of uses (0 is Unlimited)",
"role": "Please select a role for the user to be auto assigned (optional)",
"refresh": "Refresh",
"inviteURL": "Invite URL",
"domain": "https://kaverti.com/invite/"
}
},
"permissionTypes": {
"inviteUsers": "Invite users",
"administrator": "Administrator",
"modifyRoles": "Modify roles/permissions/users",
"modifyTeamSettings": "Modify team settings",
"teamForum": "Modify team forum configuration",
"forumModerator": "Forum moderation permissions",
"forumAdmin": "Forum administrator",
"submitMarketplace": "Submit Marketplace items",
"priorityValue": "Set priority value"
}
},
"navbar": {
"home": "ok £50 extra",
"forums": "can u fix that for £10 extra",
"marketplace": "£30 Its the last thing im asking for troplo.",
"downloads": "dont tell anyone who i am here",
"games": "have u seen bloxtopia's games",
"users": "as i was not payed yet",
"teams": "leave me alone",
"dev": {
"title": "i might come back to development",
"fakeUser": "user : root",
"debug": "fixed the hta"
},
"user": {
"title": "Unknown",
"profile": "My Profile",
"creations": "My Creations",
"downloads": "Downloads",
"avatar": "My Avatar",
"transactions": "Transactions",
"settings": "Settings",
"logout": "Logout"
},
"more": {
"title": "a",
"twitter": "Twitter",
"discord": "Discord",
"roadmap": "Roadmap",
"documentation": "API Docs",
"stats": "Kaverti Stats"
},
"register": "u got the .net?",
"login": "/phpmyadmin"
},
"debug": {
"title": "Debug mode enabled",
"authUser": "Authenticated user",
"state": "State dump",
"userState": "User state dump",
"token": "Auth token in state",
"disable": "Disable debug options",
"auth": "Test authentication"
},
"errors": {
"authFail": "i control the files",
"devBuild": "ok so i put this and it instantly redirects to unbale",
"disableDebug": "Debug mode disabled, you will no longer have access to development features until you refresh.",
"authSuccess": "Request successful, your token is valid, and the Kaverti server instance is running correctly."
},
"user": {
"title": "Loading",
"about": "About",
"more": "More of",
"posts": "Posts",
"threads": "Threads",
"inventory": "Inventory",
"awards": "Awards",
"items": "Items",
"wall": "User Wall",
"description": "Description",
"created": "Registered at"
},
"stats": {
"title": "Stats",
"users": "Registered users",
"purchased": "Purchased items",
"items": "Uploaded items",
"posts": "Forum posts",
"threads": "Threads",
"teams": "Teams"
},
"settings": {
"title": "User Settings",
"general": {
"title": "General"
},
"security": {
"title": "Security"
}
},
"languages": {
"title": "(Locale Select) can you put out an announcement on the kaverti server",
"en": "(English) ill pay extra with the tet domain if u do £50 infact £100",
"wind": "(Windspeak) are you having a bubble",
"debug": "(Debug) hello mr trooooplooo"
},
"currency": "fuck you",
"close": "I've just told the full truth to logan",
"tos": "get the fuck over it, it was never a scam",
"gotIt": "that is wind for you",
"errorModalTitle": "{INSERT PHP ERROR} We'll you are getting paid alot"
}

View file

@ -1,68 +1,67 @@
import Vue from 'vue' import Vue from "vue";
import App from './App.vue' import App from "./App.vue";
import router from './router' import router from "./router";
import store from './store' import store from "./store";
import Buefy, {Snackbar} from 'buefy' import Buefy, { Snackbar } from "buefy";
import axios from 'axios' import axios from "axios";
import VueAxios from 'vue-axios' import VueAxios from "vue-axios";
import i18n from './i18n' import i18n from "./i18n";
import moment from 'moment' import moment from "moment";
import VMdEditor from '@kangc/v-md-editor'; import VMdEditor from "@kangc/v-md-editor";
import '@kangc/v-md-editor/lib/style/base-editor.css'; import "@kangc/v-md-editor/lib/style/base-editor.css";
import enUS from '@kangc/v-md-editor/lib/lang/en-US'; import enUS from "@kangc/v-md-editor/lib/lang/en-US";
import createHljsTheme from '@kangc/v-md-editor/lib/theme/hljs'; import createHljsTheme from "@kangc/v-md-editor/lib/theme/hljs";
import json from 'highlight.js/lib/languages/json'; import json from "highlight.js/lib/languages/json";
const hljsTheme = createHljsTheme(); const hljsTheme = createHljsTheme();
import io from 'socket.io-client' import io from "socket.io-client";
import VueSocketIO from "vue-socket.io"; import VueSocketIO from "vue-socket.io";
import NProgress from "vue-nprogress"; import NProgress from "vue-nprogress";
Vue.use(NProgress)
const nprogress = new NProgress() Vue.use(NProgress);
const nprogress = new NProgress();
Vue.use( Vue.use(
new VueSocketIO({ new VueSocketIO({
debug: true, debug: true,
connection: io(process.env.VUE_APP_GATEWAYENDPOINT), // options object is Optional connection: io(process.env.VUE_APP_GATEWAY_ENDPOINT), // options object is Optional
}) })
); );
Vue.use(VMdEditor) Vue.use(VMdEditor);
VMdEditor.lang.use('en-US', enUS); Vue.use(VueAxios, axios);
Vue.use(Buefy);
Vue.config.productionTip = false;
Vue.prototype.$snackbar = Snackbar;
axios.defaults.headers.common["Authorization"] = localStorage.getItem("token")
// BBCode Configuration
VMdEditor.lang.use("en-US", enUS);
hljsTheme.extend((md, hljs) => { hljsTheme.extend((md, hljs) => {
md.set({ md.set({
html: false, // Enable HTML tags in source html: false,
xhtmlOut: false, // Use '/' to close single tags (<br />). xhtmlOut: false,
// This is only for full CommonMark compatibility. breaks: true,
breaks: true, // Convert '\n' in paragraphs into <br> langPrefix: "language-",
langPrefix: 'language-', // CSS language prefix for fenced blocks. Can be linkify: true,
// useful for external highlighters.
linkify: true, // Autoconvert URL-like text to links
image: false, image: false,
// Enable some language-neutral replacement + quotes beautification
typographer: true, typographer: true,
quotes: "“”‘’"
// Double + single quotes replacement pairs, when typographer enabled,
// and smartquotes on. Could be either a String or an Array.
//
// For example, you can use '«»„“' for Russian, '„“‚‘' for German,
// and ['«\xA0', '\xA0»', '\xA0', '\xA0'] for French (including nbsp).
quotes: '“”‘’'
})
md.disable('image')
hljs.registerLanguage('json', json);
}); });
Vue.use(VueAxios, axios) md.disable("image");
Vue.use(Buefy) hljs.registerLanguage("json", json);
Vue.config.productionTip = false });
Vue.prototype.$snackbar = Snackbar
Vue.filter('formatDate', function(value) { // Date Format Configuration
Vue.filter("formatDate", function(value) {
if (value) { if (value) {
return moment(String(value)).format('hh:mm A, DD/MM/YYYY') return moment(String(value)).format("hh:mm A, DD/MM/YYYY");
} }
}) });
new Vue({ new Vue({
nprogress, nprogress,
router, router,
store, store,
i18n, i18n,
render: h => h(App) render: h => h(App)
}).$mount('#app') }).$mount("#app");

View file

@ -171,11 +171,27 @@ const routes = [{
{ {
path: '/admin', path: '/admin',
component: route('Admin'), component: route('Admin'),
redirect: "/admin/dashboard",
children: [ children: [
{ path: 'dashboard', component: route('AdminDashboard') }, { path: 'dashboard', component: route('AdminDashboard') },
{ path: 'item', component: route('AdminCreateItem') }, { path: 'item', component: route('AdminCreateItem') },
] ]
}, },
{
path: '/settings',
component: route('Settings'),
redirect: "/settings/general",
children: [
{ path: 'general', component: route('SettingsGeneral') },
{ path: 'security', component: route('SettingsSecurity') },
{ path: 'about', component: route('SettingsAbout') },
]
},
{
path: '/verify/:code',
name: 'EmailVerify',
component: route('EmailVerify')
},
{ {
path: '*', path: '*',
name: '404', name: '404',

View file

@ -10,7 +10,7 @@ export default new Vuex.Store({
wind: false, wind: false,
enableBrokenRoutes: false, enableBrokenRoutes: false,
client: { client: {
clientVersion: '1.0.0-prerelease4', clientVersion: process.env.VUE_APP_VERSION,
latestClientVersion: '', latestClientVersion: '',
latestAPIVersion: '', latestAPIVersion: '',
bannerText: '', bannerText: '',
@ -20,7 +20,12 @@ export default new Vuex.Store({
name: "Kaverti", name: "Kaverti",
logo: '', logo: '',
icon: '', icon: '',
release: process.env.VUE_APP_RELEASE release: process.env.VUE_APP_RELEASE,
development: window.location.hostname === 'dev.kaverti.flowinity' || window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1',
secure: window.location.protocol === "https:",
domain: window.location.hostname,
buildDate: process.env.VUE_APP_BUILD_DATE,
lang: 'debug'
}, },
errors: { errors: {
errors: null, errors: null,
@ -175,6 +180,18 @@ export default new Vuex.Store({
}, },
setCurrentConversation(state, id) { setCurrentConversation(state, id) {
state.user.currentConversation = id state.user.currentConversation = id
},
setSecure(state, value) {
state.client.secure = value;
},
issueLogout(state) {
state.user.username = ''
state.user.token = ''
state.user.koins = 0
state.user.id = 0
},
setLang(state, value) {
state.client.lang = value
} }
}, },
actions: {}, actions: {},

File diff suppressed because it is too large Load diff

View file

@ -18,7 +18,21 @@
</div> </div>
</div> </div>
</div> </div>
<div class="column" v-if="!$store.state.user.admin"> <div class="columns is-centered" v-if="$store.state.user.modeler && !$store.state.user.admin">
<div class="column is-2">
<b-menu class="box">
<b-menu-list :label="$t('admin.title')">
<b-menu-item @click="$router.push('/admin/item')" :label="$t('admin.uploadItem')"></b-menu-item>
</b-menu-list>
</b-menu>
</div>
<div class="column is-9">
<div class="box">
<router-view></router-view>
</div>
</div>
</div>
<div class="column" v-if="!$store.state.user.admin && !$store.state.user.modeler">
<div class="box"> <div class="box">
<div class="is-vcentered has-text-centered columns"> <div class="is-vcentered has-text-centered columns">
<div class="column is-vcentered"> <div class="column is-vcentered">

View file

@ -103,7 +103,7 @@ export default {
data.append('image', this.item.file); data.append('image', this.item.file);
data.append('fileObj', this.item.fileObj); data.append('fileObj', this.item.fileObj);
this.axios.post(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'marketplace/preview/' + this.createType, data) this.axios.post(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'marketplace/preview/' + this.createType, data)
.then((res) => { .then((res) => {
this.loadingPreview = false this.loadingPreview = false
this.preview = res.data.image this.preview = res.data.image
@ -125,10 +125,10 @@ export default {
data.append('onSalePrice', this.item.onSalePrice); data.append('onSalePrice', this.item.onSalePrice);
data.append('limited', this.item.limited); data.append('limited', this.item.limited);
data.append('quantityAllowed', this.item.quantity); data.append('quantityAllowed', this.item.quantity);
this.axios.post(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'marketplace/upload/' + this.createType, data) this.axios.post(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'marketplace/upload/' + this.createType, data)
.then((res) => { .then((res) => {
this.loading = false this.loading = false
this.axios.put(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'marketplace/rerender/' + res.data.id) this.axios.put(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'marketplace/rerender/' + res.data.id)
}).catch((e) => { }).catch((e) => {
this.loading = false this.loading = false
AjaxErrorHandler(this.$store)(e) AjaxErrorHandler(this.$store)(e)

View file

@ -5,8 +5,8 @@
<div class="column is-3 has-text-centered"> <div class="column is-3 has-text-centered">
<h1 class="title">{{$store.state.user.username}}</h1> <h1 class="title">{{$store.state.user.username}}</h1>
<div class="box has-text-centered"> <div class="box has-text-centered">
<img :src="'https://cdn.kaverti.com/user/avatars/full/' + $store.state.user.avatar + '.png'"> <img :src="'https://cdn.kaverti.com/user/avatars/full/' + $store.state.user.avatar + '.png'"><br>
<b-button :loading="refreshAvatarLoading" class="is-info" @click="refresh()">Re-render</b-button> <b-button :loading="refreshAvatarLoading" class="is-info" @click="refresh()">{{$t('avatar.reRender')}}</b-button>
</div> </div>
</div> </div>
<div class="column"> <div class="column">
@ -25,7 +25,7 @@
<div class="column is-4 has-text-centered" v-for='(item) in items' :key='"inventory-item-" + item.id'> <div class="column is-4 has-text-centered" v-for='(item) in items' :key='"inventory-item-" + item.id'>
<h1 class="subtitle">{{item.Item.name}}</h1> <h1 class="subtitle">{{item.Item.name}}</h1>
<div class="box"> <div class="box">
<img :src="'https://cdn.kaverti.com/marketplace/avatars/full/' + item.Item.previewFile + '.png'"> <img :src="'https://cdn.kaverti.com/marketplace/avatars/' + item.Item.previewFile + '.png'">
<br> <br>
<b-button>Apply</b-button> <b-button>Apply</b-button>
</div> </div>
@ -61,7 +61,7 @@ export default {
refresh() { refresh() {
this.refreshAvatarLoading = true this.refreshAvatarLoading = true
this.axios this.axios
.post(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'users/render/refresh') .post(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'users/render/refresh')
.then(() => { .then(() => {
this.refreshAvatarLoading = false this.refreshAvatarLoading = false
}) })
@ -76,7 +76,7 @@ export default {
getItems() { getItems() {
this.loading = true; this.loading = true;
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'inventory/' + this.coreCategory) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'inventory/' + this.category)
.then(res => { .then(res => {
this.items = res.data.rows; this.items = res.data.rows;
this.count = res.data.count this.count = res.data.count

View file

@ -147,7 +147,7 @@ export default {
if(name.length) { if(name.length) {
this.axios this.axios
.put(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `chat/conversation/${this.$route.params.id}/name`, { name }) .put(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + `chat/conversation/${this.$route.params.id}/name`, { name })
.then(res => { .then(res => {
this.name = name; this.name = name;
res res
@ -189,7 +189,7 @@ export default {
this.loading = true; this.loading = true;
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `chat/conversation/${this.$route.params.id}?page=${this.page}`) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + `chat/conversation/${this.$route.params.id}?page=${this.page}`)
.then(res => { .then(res => {
this.loading = false; this.loading = false;
this.showModal = false; this.showModal = false;

View file

@ -1,19 +1,43 @@
<template> <template>
<main> <div id="debug">
<section class="section">
<div class="container" v-if="!$store.state.client.development">
<div class="columns is-centered">
<div class="column"> <div class="column">
<div class="box"> <div class="box">
{{$t('debug.title')}}: {{$store.state.debug}} <div class="title">
<br> {{ $t("debug.title") }}: {{ store.state.debug }}
<div v-if="$store.state.debug"> {{$t('debug.authUser')}}: {{$store.state.user.username}}<br>
{{$t('debug.userState')}}: {{$store.state.user}}<br>
{{$t('debug.state')}}: {{$store.state}}<br>
{{$t('debug.token')}}: {{$store.state.user.token}}
</div> </div>
<b-button v-if="$store.state.debug" @click="authTest">{{$t('debug.auth')}}</b-button> <hr>
<b-button v-if="$store.state.debug" @click="turnOffDebug">{{$t('debug.disable')}}</b-button> <p>If you'd like to re-enable debug mode refresh.</p>
</div> </div>
</div> </div>
</main> </div>
</div>
<div class="container" v-else>
<div class="columns is-centered">
<div class="column is-7">
<div class="box" style="overflow: none">
<div class="title">
{{ $t("debug.title") }}: {{ $store.state.client.development }}
</div>
<hr />
{{ $t("debug.authUser") }}: {{ $store.state.user.username }}<br />
{{ $t("debug.userState") }}: {{ $store.state.user }}<br />
{{ $t("debug.state") }}: {{ $store.state }}<br />
{{ $t("debug.token") }}: {{ $store.state.user.token }}
</div>
<b-button v-if="$store.state.client.development" @click="authTest">{{
$t("debug.auth")
}}</b-button>
<b-button v-if="$store.state.client.development" @click="turnOffDebug">{{
$t("debug.disable")
}}</b-button>
</div>
</div>
</div>
</section>
</div>
</template> </template>
<script> <script>
@ -21,17 +45,29 @@ export default {
name: "Debug", name: "Debug",
methods: { methods: {
turnOffDebug() { turnOffDebug() {
this.$store.commit('turnOffDebug') this.$store.commit("turnOffDebug");
this.$buefy.snackbar.open({message:this.$t('errors.disableDebug'), type: 'is-warning'}) this.$buefy.snackbar.open({
message: this.$t("errors.disableDebug"),
type: "is-warning",
});
}, },
authTest() { authTest() {
this.axios.get('/api/v1/userinfo/auth' this.axios
).then(() => { .get(process.env.VUE_APP_API_ENDPOINT +
this.$buefy.snackbar.open({message:this.$t('errors.authSuccess'), type: 'is-warning'}) process.env.VUE_APP_API_VERSION + "/userinfo/auth")
}).catch(() => { .then(() => {
this.$buefy.snackbar.open({message:this.$t('errors.authFail'), type: 'is-warning'}) this.$buefy.snackbar.open({
message: this.$t("errors.authSuccess"),
type: "is-warning",
});
}) })
} .catch(() => {
} this.$buefy.snackbar.open({
} message: this.$t("errors.authFail"),
type: "is-warning",
});
});
},
},
};
</script> </script>

78
src/views/EmailVerify.vue Normal file
View file

@ -0,0 +1,78 @@
<template>
<div id="email-verify">
<section class="section">
<div class="container">
<div class="column has-text-centered" v-if="!$store.state.user.emailVerified && !verified && !failed">
<div class="box">
<i class="large-icon fas fa-circle-notch fa-spin"></i>
<div class="title">Verifying your email</div>
<div class="subtitle">Please wait...</div>
</div>
</div>
<div class="column has-text-centered" v-if="failed">
<div class="box">
<i class="large-icon far fa-times-square"></i>
<div class="title">Something went wrong</div>
<div class="subtitle" v-for="fail in failReason" :key="'mailFail-' + fail">{{fail}}</div>
<b-button @click="retry">Retry</b-button>
</div>
</div>
<div class="column has-text-centered" v-if="verified">
<div class="box">
<div class="title">Your email has been verified.</div>
<div class="subtitle">Thank you, and enjoy using Kaverti.</div>
</div>
</div>
</div>
</section>
</div>
</template>
<script>
import AjaxErrorHandler from "@/assets/js/errorHandler";
export default {
name: "EmailVerify",
data() {
return {
verified: false,
failed: false,
failReason: this.$store.state.errors.errors
}
},
methods: {
retry() {
this.axios.put(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + `users/verify/` + this.$route.params.code)
.then(() => {
this.verified = true
this.failed = false
this.$store.commit('setEmailVerified', true)
})
.catch((e) => {
this.failed = true
this.verified = false
AjaxErrorHandler(this.$store)(e)
})
}
},
mounted() {
this.$nextTick(
this.axios.put(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + `users/verify/` + this.$route.params.code)
.then(() => {
this.verified = true
this.failed = false
this.$store.commit('setEmailVerified', true)
})
.catch((e) => {
this.failed = true
this.verified = false
AjaxErrorHandler(this.$store)(e)
})
)
}
}
</script>
<style scoped>
</style>

View file

@ -1,166 +1,33 @@
<template> <template>
<main class="section"> <div id="forum-thread">
<b-modal v-model="postModal">
<div class="editor">
<editor-menu-bar :editor="editor" v-slot="{ commands, isActive }">
<div class="menubar">
<button
class="menubar__button"
:class="{ 'is-active': isActive.bold() }"
@click="commands.bold"
>
<icon name="bold" />
</button>
<button
class="menubar__button"
:class="{ 'is-active': isActive.italic() }"
@click="commands.italic"
>
<icon name="italic" />
</button>
<button
class="menubar__button"
:class="{ 'is-active': isActive.strike() }"
@click="commands.strike"
>
<icon name="strike" />
</button>
<button
class="menubar__button"
:class="{ 'is-active': isActive.underline() }"
@click="commands.underline"
>
<icon name="underline" />
</button>
<button
class="menubar__button"
:class="{ 'is-active': isActive.code() }"
@click="commands.code"
>
<icon name="code" />
</button>
<button
class="menubar__button"
:class="{ 'is-active': isActive.paragraph() }"
@click="commands.paragraph"
>
<icon name="paragraph" />
</button>
<button
class="menubar__button"
:class="{ 'is-active': isActive.heading({ level: 1 }) }"
@click="commands.heading({ level: 1 })"
>
H1
</button>
<button
class="menubar__button"
:class="{ 'is-active': isActive.heading({ level: 2 }) }"
@click="commands.heading({ level: 2 })"
>
H2
</button>
<button
class="menubar__button"
:class="{ 'is-active': isActive.heading({ level: 3 }) }"
@click="commands.heading({ level: 3 })"
>
H3
</button>
<button
class="menubar__button"
:class="{ 'is-active': isActive.bullet_list() }"
@click="commands.bullet_list"
>
<icon name="ul" />
</button>
<button
class="menubar__button"
:class="{ 'is-active': isActive.ordered_list() }"
@click="commands.ordered_list"
>
<icon name="ol" />
</button>
<button
class="menubar__button"
:class="{ 'is-active': isActive.blockquote() }"
@click="commands.blockquote"
>
<icon name="quote" />
</button>
<button
class="menubar__button"
:class="{ 'is-active': isActive.code_block() }"
@click="commands.code_block"
>
<icon name="code" />
</button>
<button
class="menubar__button"
@click="commands.horizontal_rule"
>
<icon name="hr" />
</button>
<button
class="menubar__button"
@click="commands.undo"
>
<icon name="undo" />
</button>
<button
class="menubar__button"
@click="commands.redo"
>
<icon name="redo" />
</button>
</div> </div>
</editor-menu-bar> <!-- <main class="section">-->
<!-- <h1 class="title">{{thread.name}}&nbsp;<b-tag v-if="thread.locked">Locked</b-tag><b-button @click="replyToThread()"><i class="fas fa-reply-all"></i></b-button></h1>-->
<editor-content class="editor__content" :editor="editor" /> <!-- <div class="">-->
</div> <!-- <div class="column" v-for='(post) in thread.Posts' :key='"threadPost-" + post.id'>-->
</b-modal> <!-- <article class="media box">-->
<h1 class="title">{{thread.name}}&nbsp;<b-tag v-if="thread.locked">Locked</b-tag><b-button @click="replyToThread()"><i class="fas fa-reply-all"></i></b-button></h1> <!-- <figure class="media-left">-->
<div class=""> <!-- <p class="image is-64x64">-->
<div class="column" v-for='(post) in thread.Posts' :key='"threadPost-" + post.id'> <!-- <img :src="'https://cdn.kaverti.com/user/avatars/headshot/' + post.User.picture + '.png'">-->
<article class="media box"> <!-- </p>-->
<figure class="media-left"> <!-- </figure>-->
<p class="image is-64x64"> <!-- <div class="media-content">-->
<img :src="'https://cdn.kaverti.com/user/avatars/headshot/' + post.User.picture + '.png'"> <!-- <div class="content">-->
</p> <!-- <p>-->
</figure> <!-- <strong>{{post.User.username}}</strong> <small>{{ post.createdAt | formatDate }}</small>-->
<div class="media-content"> <!-- <br>-->
<div class="content"> <!-- <p>-->
<p> <!-- <div v-html="post.content"></div>-->
<strong>{{post.User.username}}</strong> <small>{{ post.createdAt | formatDate }}</small> <!-- </div>-->
<br> <!-- </div>-->
<p> <!-- <div class="media-right">-->
<div v-html="post.content"></div> <!-- <b-button @click="replyToPost(post)"><i class="fas fa-reply"></i></b-button>-->
</div> <!-- </div>-->
</div> <!-- </article>-->
<div class="media-right"> <!-- </div>-->
<b-button @click="replyToPost(post)"><i class="fas fa-reply"></i></b-button> <!-- </div>-->
</div> <!-- </main>-->
</article>
</div>
</div>
</main>
</template> </template>
<script> <script>
@ -229,7 +96,7 @@ export default {
}, },
replyToPost(post) { replyToPost(post) {
post this.postModal = true;
}, },
getThread(initial) { getThread(initial) {
this.loading = true this.loading = true
@ -238,7 +105,7 @@ export default {
this.thread = [] this.thread = []
} }
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'forums/thread/' + this.$route.params.id) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'forums/thread/' + this.$route.params.id)
.then((res) => { .then((res) => {
if(initial) { if(initial) {
this.thread = res.data this.thread = res.data

View file

@ -27,12 +27,12 @@
> >
<NoItems connection="true"></NoItems> <NoItems connection="true"></NoItems>
</div> </div>
<div class="column is-7" v-if="!threads.length && !loadingThreads"> <div class="column is-9" v-if="!threads.length && !loadingThreads">
<div class="box"> <div class="box">
<NoItems type="forum threads"></NoItems> <NoItems type="forum threads"></NoItems>
</div> </div>
</div> </div>
<div class="column is-7" v-if="threads.length"> <div class="column is-9" v-if="threads.length">
<div class="content"> <div class="content">
<article <article
class="thread_display box" class="thread_display box"
@ -126,8 +126,8 @@ export default {
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
"/" + "/" +
"forums/category/" + "forums/category/" +
this.selectedCategory this.selectedCategory
@ -163,8 +163,8 @@ export default {
mounted() { mounted() {
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
`/` + `/` +
"forums/category" "forums/category"
) )

View file

@ -1,54 +1,51 @@
<template> <template>
<main> <div id="friends">
<div class="section"> <section class="section">
<h1 class="title has-text-centered">{{name}} ({{count}})</h1> <div class="columns is-centered">
<div class="column is-7 has-text-centered">
<div class="title">{{ name }} ({{ count }})</div>
<div class="tabs is-centered"> <div class="tabs is-centered">
<ul> <ul>
<router-link tag="li" :to="'/friends/pendingCanAccept'" exact><a>{{ $t('friends.pendingCanAccept') }}</a></router-link> <router-link tag="li" :to="'/friends/pendingCanAccept'" exact><a>{{ $t('friends.pendingCanAccept') }}</a>
<router-link tag="li" :to="'/friends/accepted'" exact><a>{{ $t('friends.accepted') }}</a></router-link> </router-link>
<router-link tag="li" :to="'/friends/pending'" exact><a>{{ $t('friends.pending') }}</a></router-link> <router-link tag="li" :to="'/friends/pending'" exact><a>{{ $t('friends.pending') }}</a></router-link>
<router-link tag="li" :to="'/friends/accepted'" exact><a>{{ $t('friends.accepted') }}</a></router-link>
</ul> </ul>
</div> </div>
<div class="columns is-multiline" v-if="friends.length && !loading"> <div class="columns is-multiline" v-if="friends.length && !loading">
<div class="column is-3 has-text-centered" v-for='(friend) in friends' :key='"friend-" + friend.id'> <div class="column is-3 has-text-centered" v-for='(friend) in friends' :key='"friend-" + friend.id'>
<h1 class="title has-text-centered">{{ friend.friend2.username }}</h1> <h1 class="title has-text-centered">{{ friend.friend2.username }}</h1>
<div class="box"> <div class="box">
<img :src="'https://cdn.kaverti.com/user/avatars/full/' + friend.friend2.picture + '.png'"><br> <img :src="'https://cdn.kaverti.com/user/avatars/full/' + friend.friend2.picture + '.png'" alt="Avatar"><br>
<div class="buttons"> <div class="buttons">
<b-button @click="removeFriend(friend)" class="is-warning has-text-centered is-centered is-center" v-if="friend.type === 'pending'"><i class="fas fa-minus"></i>&nbsp;Cancel Friend Request</b-button> <b-button @click="removeFriend(friend)" class="is-warning has-text-centered is-centered is-center"
<b-button @click="removeFriend(friend)" class="is-warning has-text-centered is-centered is-center" v-if="friend.type === 'pendingCanAccept'"><i class="fas fa-minus"></i>&nbsp;Deny Friend Request</b-button> v-if="friend.type === 'pending'"><i class="fas fa-minus"></i>&nbsp;Cancel Friend Request
<b-button @click="doRelationshipAccept(friend)" class="is-success has-text-centered is-centered is-center" v-if="friend.type === 'pendingCanAccept'"><i class="fas fa-plus"></i>&nbsp;Accept Friend Request</b-button> </b-button>
<b-button @click="removeFriend(friend)" class="is-danger has-text-centered is-centered is-center" v-if="friend.type === 'accepted'"><i class="fas fa-minus"></i>&nbsp;Remove Friend</b-button> <b-button @click="removeFriend(friend)" class="is-warning has-text-centered is-centered is-center"
v-if="friend.type === 'pendingCanAccept'"><i class="fas fa-minus"></i>&nbsp;Deny Friend
Request
</b-button>
<b-button @click="doRelationshipAccept(friend)"
class="is-success has-text-centered is-centered is-center"
v-if="friend.type === 'pendingCanAccept'"><i class="fas fa-plus"></i>&nbsp;Accept Friend
Request
</b-button>
<b-button @click="removeFriend(friend)" class="is-danger has-text-centered is-centered is-center"
v-if="friend.type === 'accepted'"><i class="fas fa-minus"></i>&nbsp;Remove Friend
</b-button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="section" v-if="!friends.length && !loading">
<NoItems type="friends"></NoItems>
</div>
<div class="section columns" v-if="loading">
<div class="column">
<div class="box">
<b-skeleton></b-skeleton>
</div> </div>
</div> </div>
<div class="column"> </section>
<div class="box">
<b-skeleton></b-skeleton>
</div> </div>
</div>
<div class="column">
<div class="box">
<b-skeleton></b-skeleton>
</div>
</div>
</div>
</div>
</main>
</template> </template>
<script> <script>
import AjaxErrorHandler from ".././assets/js/errorHandler"; import AjaxErrorHandler from ".././assets/js/errorHandler";
import NoItems from "../components/NoItems" import NoItems from "../components/NoItems"
export default { export default {
name: 'Friends', name: 'Friends',
components: { components: {
@ -65,81 +62,85 @@ export default {
}, },
watch: { watch: {
$route() { $route() {
this.loading = true this.loading = true;
this.friends = [] this.friends = [];
this.offset = 0 this.offset = 0;
this.category = this.$route.params.category this.category = this.$route.params.category;
if (this.category === 'pendingCanAccept') { if (this.category === 'pendingCanAccept') {
this.name = "Requests to you" this.name = "Requests to you";
} else if (this.category === 'pending') { } else if (this.category === 'pending') {
this.name = "Requests from you" this.name = "Requests from you";
} else if (this.category === 'accepted') { } else if (this.category === 'accepted') {
this.name = "Accepted Requests" this.name = "Accepted Requests";
} else { } else {
this.name = "Unknown" this.name = "Unknown";
} }
this.getItems() this.getItems();
} }
}, },
methods: { methods: {
removeFriend(user) { removeFriend(user) {
this.axios this.axios
.put(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'relationships/remove', { .put(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'relationships/remove', {
friend: user.friend2.username friend: user.friend2.username
}) })
.then(() => { .then(() => {
this.getItems() this.getItems();
}) })
.catch(e => { .catch(e => {
this.getItems() this.getItems();
AjaxErrorHandler(this.$store)(e) AjaxErrorHandler(this.$store)(e);
}) });
}, },
doRelationshipAccept(user) { doRelationshipAccept(user) {
this.axios this.axios
.put(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'relationships/accept', { .put(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'relationships/accept', {
friend: user.friend2.username friend: user.friend2.username
}) })
.then(() => { .then(() => {
this.getItems() this.getItems();
}) })
.catch(e => { .catch(e => {
this.getItems() this.getItems();
AjaxErrorHandler(this.$store)(e) AjaxErrorHandler(this.$store)(e);
}) });
}, },
getItems() { getItems() {
this.loading = true this.loading = true;
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'relationships/getAll/' + this.category) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'relationships/getAll/' + this.category)
.then(res => { .then(res => {
this.friends = res.data.rows this.friends = res.data.rows;
this.count = res.data.count this.count = res.data.count;
this.loading = false this.loading = false;
}) })
.catch((e) => { .catch((e) => {
this.loading = false this.loading = false;
AjaxErrorHandler(this.$store)(e)
AjaxErrorHandler(this.$store)(e);
}) })
}, },
}, },
mounted() { mounted() {
this.loading = true if (this.$store.state.user.username) {
this.friends = [] this.loading = true;
this.offset = 0 this.friends = [];
this.category = this.$route.params.category this.offset = 0;
this.category = this.$route.params.category;
if (this.category === 'pendingCanAccept') { if (this.category === 'pendingCanAccept') {
this.name = "Requests to you" this.name = "Requests to you";
} else if (this.category === 'pending') { } else if (this.category === 'pending') {
this.name = "Requests from you" this.name = "Requests from you";
} else if (this.category === 'accepted') { } else if (this.category === 'accepted') {
this.name = "Accepted Requests" this.name = "Accepted Requests";
} else { } else {
this.name = "Unknown" this.name = "Unknown";
}
this.getItems();
} }
this.getItems()
} }
} }
</script> </script>

View file

@ -8,13 +8,21 @@
<div class="title"> <div class="title">
{{ $store.state.user.username }} {{ $store.state.user.username }}
</div> </div>
<img :src="'https://cdn.kaverti.com/user/avatars/full/' + $store.state.user.avatar + '.png'" alt="Avatar" width="50%"> <img
:src="
'https://cdn.kaverti.com/user/avatars/full/' +
$store.state.user.avatar +
'.png'
"
alt="Avatar"
class="is-centered"
/>
</div> </div>
<div class="title"> <div class="title">
{{ $t('home.news') }} {{ $t("home.news") }}
</div> </div>
<div v-if="blogs.length"> <div v-if="blogs.length">
<div class="box" v-for='(blog) in blogs' :key='"blog-" + blog.id'> <div class="box" v-for="blog in blogs" :key="'blog-' + blog.id">
<div class="subtitle"> <div class="subtitle">
{{ blog.name }} {{ blog.name }}
</div> </div>
@ -27,31 +35,55 @@
</div> </div>
</div> </div>
</div> </div>
<div class="column is-7" v-if="!loading"> <div class="column is-8" v-if="!loading">
<div class="box"> <div class="box">
<div class="title"> <div class="title">
{{ $t('home.globalWall') }} {{ $t("home.globalWall") }}
</div> </div>
<b-input type="textarea" maxlength="256" placeholder="How's it going?" v-model="wallText"></b-input> <b-input
type="textarea"
maxlength="256"
placeholder="How's it going?"
v-model="wallText"
></b-input>
<b-tag type="is-info" class="is-pulled-right"> <b-tag type="is-info" class="is-pulled-right">
Markdown is no longer available on wall posts. Markdown is no longer available on wall posts.
</b-tag> </b-tag>
<b-button type="is-info" ckass="is-pulled-left" :loading="loadingWallButton" @click="postWall">Post</b-button> <b-button
type="is-info"
ckass="is-pulled-left"
:loading="loadingWallButton"
@click="postWall"
>Post</b-button
>
</div> </div>
<hr> <hr />
<div class="box" v-for='(post) in wallPosts' :key='"wallPosts-" + post.id'> <div
class="box"
v-for="post in wallPosts"
:key="'wallPosts-' + post.id"
>
<article class="media"> <article class="media">
<figure class="media-left"> <figure class="media-left">
<figure class="image is-64x64 is-rounded"> <figure class="image is-64x64 is-rounded">
<img :src="'https://cdn.kaverti.com/user/avatars/headshot/' + post.fromUser.picture + '.png'" alt="Avatar" class="is-rounded"> <img
:src="
'https://cdn.kaverti.com/user/avatars/headshot/' +
post.fromUser.picture +
'.png'
"
alt="Avatar"
class="is-rounded"
/>
</figure> </figure>
</figure> </figure>
<div class="media-content"> <div class="media-content">
<div class="content"> <div class="content">
<p> <p>
<strong>{{ post.fromUser.username }}</strong>&nbsp; <strong>{{ post.fromUser.username }}</strong
>&nbsp;
<small>{{ post.createdAt | formatDate() }}</small> <small>{{ post.createdAt | formatDate() }}</small>
<br> <br />
{{ post.plainText }} {{ post.plainText }}
</p> </p>
</div> </div>
@ -67,105 +99,24 @@
</div> </div>
</div> </div>
</section> </section>
<section class="section hero is-info is-large is-fullheight-with-navbar" v-if="!$store.state.user.username"> <section
class="hero is-info is-large is-fullheight-with-navbar"
v-if="!$store.state.user.username"
>
<div class="hero-body"> <div class="hero-body">
<div class="container has-text-centered"> <div class="container has-text-centered">
<div class="title"> <div class="title">Kaverti</div>
Kaverti
</div>
<div class="subtitle"> <div class="subtitle">
Kaverti is a new 3D sandbox gaming platform, and avatar social website. Kaverti is a new 3D sandbox gaming platform, and avatar social
<br> website.
<br />
Kaverti is home to hundreds of users who enjoy using it Kaverti is home to hundreds of users who enjoy using it
<br> <br />
So why not sign up today! So why not sign up today!
</div> </div>
</div> </div>
</div> </div>
</section> </section>
<section class="section hero is-white is-medium" v-if="!$store.state.user.username">
<div class="hero-body">
<div class="container has-text-centered">
<div class="title">
Statistics
</div>
<div class="columns is-centered">
<div class="column has-text-centered">
<div class="title">{{ $t('stats.users') }}</div>
<div class="box">
<div class="title" v-if="!loading">
{{ users }}
</div>
<b-skeleton size="is-large" :active="loading" :count="2"></b-skeleton>
</div>
</div>
<div class="column has-text-centered">
<div class="title">{{ $t('stats.users') }}</div>
<div class="box">
<div class="title" v-if="!loading">
{{ users }}
</div>
<b-skeleton size="is-large" :active="loading" :count="2"></b-skeleton>
</div>
</div>
<div class="column has-text-centered">
<div class="title">{{ $t('stats.posts') }}</div>
<div class="box">
<div class="title" v-if="!loading">
{{ posts }}
</div>
<b-skeleton size="is-large" :active="loading" :count="2"></b-skeleton>
</div>
</div>
<div class="column has-text-centered">
<div class="title">{{ $t('stats.users') }}</div>
<div class="box">
<div class="title" v-if="!loading">
{{ users }}
</div>
<b-skeleton size="is-large" :active="loading" :count="2"></b-skeleton>
</div>
</div>
<div class="column has-text-centered">
<div class="title">{{ $t('stats.purchased') }}</div>
<div class="box">
<div class="title" v-if="!loading">
{{ inventory }}
</div>
<b-skeleton size="is-large" :active="loading" :count="2"></b-skeleton>
</div>
</div>
<div class="column has-text-centered">
<div class="title">{{ $t('stats.items') }}</div>
<div class="box">
<div class="title" v-if="!loading">
{{ items }}
</div>
<b-skeleton size="is-large" :active="loading" :count="2"></b-skeleton>
</div>
</div>
<div class="column has-text-centered">
<div class="title">{{ $t('stats.teams') }}</div>
<div class="box">
<div class="title" v-if="!loading">
{{ teams }}
</div>
<b-skeleton size="is-large" :active="loading" :count="2"></b-skeleton>
</div>
</div>
<div class="column has-text-centered">
<div class="title">{{ $t('stats.threads') }}</div>
<div class="box">
<div class="title" v-if="!loading">
{{ threads }}
</div>
<b-skeleton size="is-large" :active="loading" :count="2"></b-skeleton>
</div>
</div>
</div>
</div>
</div>
</section>
</div> </div>
</template> </template>
@ -174,83 +125,87 @@ import NoItems from "@/components/NoItems";
import AjaxErrorHandler from ".././assets/js/errorHandler"; import AjaxErrorHandler from ".././assets/js/errorHandler";
export default { export default {
name: 'Home', name: "Home",
components: { components: {
NoItems NoItems,
}, },
data() { data() {
return { return {
blogs: [], blogs: [],
wallOffset: 0, wallOffset: 0,
wallPosts: [], wallPosts: [],
wallText: '', wallText: "",
mentions: '', mentions: "",
loadingWallButton: false, loadingWallButton: false,
loadingWall: true, loadingWall: true,
users: 0, };
posts: 0,
inventory: 0,
teams: 0,
threads: 0,
items: 0,
loading: false
}
}, },
methods: { methods: {
postWall() { postWall() {
this.loadingWallButton = true this.loadingWallButton = true;
this.axios.post(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `wall/post`, { this.axios
.post(
process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_API_VERSION +
`/` +
`wall/post`,
{
username: "GlobalWall", username: "GlobalWall",
content: this.wallText content: this.wallText,
}).then(() => { }
this.loadingWallButton = false )
this.getWall(true) .then(() => {
}).catch(e => { this.loadingWallButton = false;
this.loadingWallButton = false this.getWall(true);
AjaxErrorHandler(this.$store)(e)
}) })
.catch((e) => {
this.loadingWallButton = false;
AjaxErrorHandler(this.$store)(e);
});
}, },
getWall(initial) { getWall(initial) {
this.loadingWall = true this.loadingWall = true;
if (initial) { if (initial) {
this.wallOffset = 0 this.wallOffset = 0;
} }
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `user/GlobalWall?wall=true&offset=` + this.wallOffset) .get(
.then(res => { process.env.VUE_APP_API_ENDPOINT +
this.loadingPosts = false process.env.VUE_APP_API_VERSION +
this.loadingWall = false `/` +
`user/GlobalWall?wall=true&offset=` +
this.wallOffset
)
.then((res) => {
this.loadingPosts = false;
this.loadingWall = false;
if (initial) { if (initial) {
this.wallPosts = res.data.userWalls this.wallPosts = res.data.userWalls;
} else { } else {
this.wallPosts.push(...res.data.userWalls) this.wallPosts.push(...res.data.userWalls);
} }
});
},
getBlog() {
this.axios
.get(
process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_API_VERSION +
`/` +
`blog/posts`
)
.then((res) => {
this.blogs = res.data;
}) })
.catch((e) => {
AjaxErrorHandler(this.$store)(e);
});
} }
}, },
mounted() { mounted() {
this.axios.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'kaverti/stats') this.getBlog()
.then(res => { this.getWall(true);
this.users = res.data.users },
this.posts = res.data.posts };
this.inventory = res.data.inventory
this.items = res.data.items
this.teams = res.data.teams
this.threads = res.data.threads
this.loading = false
}).catch(() => {
this.$buefy.snackbar.open({message:this.$t('errors.authFail'), type: 'is-warning'})
})
this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `blog/posts`)
.then(res => {
this.blogs = res.data
})
.catch(e => {
AjaxErrorHandler(this.$store)(e)
})
this.getWall(true)
}
}
</script> </script>

View file

@ -45,13 +45,9 @@
@loadNext='getItems(false)' @loadNext='getItems(false)'
> >
<div class="column is-3 has-text-centered" style="float: left;" v-for='(item) in items' :key='"marketplace-" + item.id'> <div class="column is-3 has-text-centered" style="float: left;" v-for='(item) in items' :key='"marketplace-" + item.id'>
<router-link :to="'/m/' + item.id" class="subtitle has-text-centered">{{item.name}}</router-link>
<div class="box"> <div class="box">
<router-link :to="'/m/' + item.id" class="subtitle has-text-centered">{{item.name}}</router-link><br>
<img :src="'https://cdn.kaverti.com/marketplace/avatars/' + item.previewFile + '.png'" width="40%"> <img :src="'https://cdn.kaverti.com/marketplace/avatars/' + item.previewFile + '.png'" width="40%">
<div class="buttons is-centered is-center">
<b-button class="is-info" v-if="!item.saleEnabled">{{$t('user.inventoryTab.buyNow')}} {{item.price}} Koins</b-button>
<b-button class="is-success" v-if="item.saleEnabled">{{$t('user.inventoryTab.buyNow')}} {{item.salePrice}} Koins <b-tooltip class="is-success" :label="$t('user.inventoryTab.onSale')"><i class="fas fa-info-circle"></i></b-tooltip></b-button>
</div>
</div> </div>
</div> </div>
</Pagination> </Pagination>
@ -165,7 +161,7 @@ export default {
this.offset = 0 this.offset = 0
this.paginate = true this.paginate = true
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'marketplace/' + this.category + '?search=' + this.search + '&offset=' + this.offset) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'marketplace/' + this.category + '?search=' + this.search + '&offset=' + this.offset)
.then(res => { .then(res => {
this.items = res.data.Items this.items = res.data.Items
this.loading = false this.loading = false
@ -181,7 +177,7 @@ export default {
this.wait = true this.wait = true
} }
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'marketplace/' + this.category + '?offset=' + this.offset) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'marketplace/' + this.category + '?offset=' + this.offset)
.then(res => { .then(res => {
if(res.data.length < this.limit) { if(res.data.length < this.limit) {
this.offset = null; this.offset = null;

View file

@ -101,13 +101,13 @@ export default {
}, },
mounted() { mounted() {
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `marketplace/view/${this.$route.params.id}`) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + `marketplace/view/${this.$route.params.id}`)
.then(res => this.item = res.data, this.loading = false) .then(res => this.item = res.data, this.loading = false)
.catch((e) => { .catch((e) => {
AjaxErrorHandler(this.$store)(e) AjaxErrorHandler(this.$store)(e)
}) })
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `marketplace/check/${this.$route.params.id}`) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + `marketplace/check/${this.$route.params.id}`)
.then(res => this.purchased = res.data.purchased) .then(res => this.purchased = res.data.purchased)
} }
} }

View file

@ -53,10 +53,10 @@
required> required>
</b-input> </b-input>
</b-field> </b-field>
<b-checkbox v-model="register.agree">{{$t('register.agree')}} <router-link @click="registerModal = false " to="/legal/tos">{{$t('tos')}}</router-link></b-checkbox> <b-checkbox v-model="register.init.agree">{{$t('register.agree')}} <router-link to="/legal/tos">{{$t('tos')}}</router-link></b-checkbox>
<br> <br>
<div class="buttons"> <div class="buttons">
<b-button class="is-info" @click="doInit" :loading="register.init.loading">{{$t('guided.registration.continue')}}</b-button> <b-button :disabled="!register.init.agree" class="is-info" @click="doInit" :loading="register.init.loading">{{$t('guided.registration.continue')}}</b-button>
<b-button>{{$t('guided.registration.init.login')}}</b-button> <b-button>{{$t('guided.registration.init.login')}}</b-button>
</div> </div>
</section> </section>
@ -73,7 +73,7 @@
<div class="box"> <div class="box">
<form> <form>
<h2 class="subtitle has-text-centered">{{ $t('guided.registration.info.description') }}</h2> <h2 class="subtitle has-text-centered">{{ $t('guided.registration.info.description') }}</h2>
<b-input v-model="register.personal.description" maxlength="256" type="textarea"></b-input> <b-input v-model="register.personal.description" :placeholder="$t('guided.registration.info.placeholder')" maxlength="256" type="textarea"></b-input>
<b-button class="is-info" @click="doInfo()" :loading="register.personal.loading">{{$t('guided.registration.continue')}}</b-button> <b-button class="is-info" @click="doInfo()" :loading="register.personal.loading">{{$t('guided.registration.continue')}}</b-button>
</form> </form>
</div> </div>
@ -86,6 +86,7 @@
<div class="columns is-centered"> <div class="columns is-centered">
<div class="column"> <div class="column">
<div class="box"> <div class="box">
<h2 class="subtitle has-text-centered">{{ $t('guided.registration.customize.themeWarning') }}</h2>
<h2 class="subtitle has-text-centered">{{ $t('guided.registration.customize.theme') }}</h2> <h2 class="subtitle has-text-centered">{{ $t('guided.registration.customize.theme') }}</h2>
<div class="buttons"> <div class="buttons">
<b-button :loading="register.customization.loading" @click="doTheme('light')" size="is-large" expanded class="is-light">{{$t('guided.registration.customize.light')}}</b-button> <b-button :loading="register.customization.loading" @click="doTheme('light')" size="is-large" expanded class="is-light">{{$t('guided.registration.customize.light')}}</b-button>
@ -113,8 +114,8 @@
Error Error
</b-step-item> </b-step-item>
<br> <br>
<b-button v-if="$store.state.debug" @click="bypassStage(true)">Debug: Bypass</b-button> <b-button v-if="$store.state.client.development" @click="bypassStage(true)">Debug: Bypass</b-button>
<b-button v-if="$store.state.debug" @click="bypassStage(false)">Debug: Back</b-button> <b-button v-if="$store.state.client.development" @click="bypassStage(false)">Debug: Back</b-button>
</b-steps> </b-steps>
</div> </div>
</section> </section>
@ -154,13 +155,13 @@ export default {
methods: { methods: {
getInfo() { getInfo() {
Object.assign(axios.defaults, {headers: {Authorization: this.$store.state.user.token}}) Object.assign(axios.defaults, {headers: {Authorization: this.$store.state.user.token}})
this.axios.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'kaverti/state') this.axios.get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'kaverti/state')
.then(res => { .then(res => {
this.$store.commit('setSettings', res.data.state) this.$store.commit('setSettings', res.data.state)
this.$store.commit('setVersion', res.data.state.latestCanaryVersion) this.$store.commit('setVersion', res.data.state.latestCanaryVersion)
this.$store.commit('setAPIVersion', res.data.apiVersion) this.$store.commit('setAPIVersion', res.data.apiVersion)
}) })
this.axios.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'userinfo') this.axios.get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'userinfo')
.then(res => { .then(res => {
this.$store.commit('setUsername', res.data.username) this.$store.commit('setUsername', res.data.username)
this.$store.commit('setEmail', res.data.email) this.$store.commit('setEmail', res.data.email)
@ -185,7 +186,8 @@ export default {
}, },
doInit() { doInit() {
this.register.init.loading = true this.register.init.loading = true
this.axios.post('/api/v1/passkey/register', { this.axios.post(process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_API_VERSION + '/passkey/register', {
username: this.register.init.username, username: this.register.init.username,
password: this.register.init.password, password: this.register.init.password,
email: this.register.init.email, email: this.register.init.email,
@ -206,7 +208,8 @@ export default {
}, },
doInfo() { doInfo() {
this.register.personal.loading = true this.register.personal.loading = true
this.axios.put('/api/v1/users/preferences', { this.axios.put(process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_API_VERSION + '/users/preferences', {
description: this.register.personal.description description: this.register.personal.description
}).then(() => { }).then(() => {
this.getInfo() this.getInfo()
@ -220,7 +223,8 @@ export default {
}, },
doTheme(theme) { doTheme(theme) {
this.register.customization.loading = true this.register.customization.loading = true
this.axios.put('/api/v1/users/preferences', { this.axios.put(process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_API_VERSION + '/users/preferences', {
theme: theme theme: theme
}).then(() => { }).then(() => {
this.getInfo() this.getInfo()

60
src/views/Settings.vue Normal file
View file

@ -0,0 +1,60 @@
<template>
<div id="settings">
<section class="section">
<div class="container" v-if="$store.state.user.username">
<div class="columns is-centered">
<div class="column is-3">
<b-menu>
<b-menu-list label="Settings">
<b-menu-item
:label="menuItem.name"
v-for="(menuItem, $index) in menuItems"
:key="'settings-link-' + $index"
tag="router-link"
:to="'/settings/' + menuItem.route"
></b-menu-item>
</b-menu-list>
</b-menu>
</div>
<div class="column is-9">
<router-view></router-view>
</div>
</div>
</div>
<div class="container" v-else>
<div class="columns is-centered">
<div class="column is-6">
<div class="box has-text-centered">
<i class="far fa-times-square large-icon"></i>
<div class="subtitle">{{ $t("generic.notLoggedIn") }}</div>
</div>
</div>
</div>
</div>
</section>
</div>
</template>
<script>
export default {
name: "Settings",
data() {
return {
menuItems: [
{
name: this.$t('settings.menu.general'),
route: "general",
},
{
name: this.$t('settings.menu.security'),
route: "security",
},
{
name: this.$t('settings.menu.about'),
route: "about",
},
],
};
},
};
</script>

View file

@ -0,0 +1,24 @@
<template>
<div id="settings-about">
<div class="box">
<div class="title">{{ $t("settings.about.title") }}</div>
<hr />
<div class="has-text-centered">
<img src="https://cdn.kaverti.com/icon.png" alt="Logo" width="10%" />
<p>Kaverti v{{ this.$store.state.client.clientVersion }}</p>
<p>
Latest Client Version: v{{
this.$store.state.client.latestClientVersion
}}
</p>
<p>API Version: v{{ this.$store.state.client.latestAPIVersion }}</p>
</div>
</div>
</div>
</template>
<script>
export default {
name: "SettingsAbout",
};
</script>

View file

@ -0,0 +1,135 @@
<template>
<div id="settings-general">
<div class="box">
<div class="title">{{ $t("settings.general.title") }}</div>
<hr />
<div class="subtitle">{{ $t("settings.general.about") }}</div>
<form @submit.prevent="saveDesc">
<b-field :label="$t('settings.general.description')">
<b-input
type="textarea"
:placeholder="
$t('settings.general.hi') + ' ' + $store.state.user.username
"
maxlength="256"
v-model="settings.description.value"
:error="settings.description.error"
></b-input>
</b-field>
<b-button
type="is-info"
:loading="settings.description.loading"
@click="saveDescription"
>
{{ $t("settings.general.saveDesc") }}
</b-button>
</form>
<form @submit.prevent="savePref">
<b-field label="Developer Mode">
<b-switch
type="is-info"
true-value="true"
false-value="false"
v-model="settings.preferences.developerMode"
>{{ settings.preferences.developerMode }}</b-switch>
</b-field>
<b-button
type="is-info"
:loading="settings.preferences.loading"
@click="savepreferences"
>
{{ $t("settings.general.savePref") }}
</b-button>
</form>
</div>
</div>
</template>
<script>
export default {
name: "SettingsGeneral",
data() {
return {
settings: {
description: {
value: this.$store.state.user.description,
loading: false,
error: "",
},
preferences: {
developerMode: this.$store.state.user.developerMode,
loading: false,
error: "",
},
},
};
},
methods: {
clearErrors() {
this.settings.description.error = "";
this.settings.preferences.error = "";
},
changesSaved() {
this.$buefy.snackbar.open({
duration: 5000,
message: "Changes saved.",
type: "is-success",
position: "is-bottom-left",
actionText: "Ok",
queue: false,
});
},
saveDescription() {
this.clearErrors();
this.settings.description.loading = true;
this.axios
.put(
process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_API_VERSION +
"/users/preferences",
{
description: this.settings.description.value,
}
)
.then(() => {
this.settings.description.loading = false;
this.changesSaved();
})
.catch((err) => {
this.settings.description.loading = false;
AjaxErrorHandler(this.$store)(err);
});
},
savepreferences() {
this.clearErrors();
this.settings.preferences.loading = true;
this.axios
.put(
process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_API_VERSION +
"/users/preferences",
{
developerMode: this.settings.preferences.developerMode,
}
)
.then(() => {
this.axios
.get(
process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_API_VERSION +
"/userinfo"
)
.then((res) => {
this.$store.commit("setDevMode", res.data.developerMode);
});
this.settings.description.loading = false;
this.changesSaved();
})
.catch((err) => {
this.settings.preferences.loading = false;
AjaxErrorHandler(this.$store)(err);
});
},
},
};
</script>

View file

@ -0,0 +1,158 @@
<template>
<div id="settings-account">
<div class="box">
<div class="title">{{ $t("settings.security.title") }}</div>
<hr>
<div class="subtitle">{{$t('settings.security.password.title')}}</div>
<b-field :label="$t('settings.security.password.oldPassword')">
<b-input type="password" v-model="password.oldPassword" :placeholder="$t('settings.security.password.oldPassword')"></b-input>
</b-field>
<b-field :label="$t('settings.security.password.newPassword')">
<b-input type="password" minlength="6" maxlength="50" v-model="password.newPassword" :placeholder="$t('settings.security.password.newPassword')"></b-input>
</b-field>
<b-field :label="$t('settings.security.password.newPasswordConfirm')">
<b-input type="password" minlength="6" maxlength="50" v-model="password.newPasswordConfirm" :placeholder="$t('settings.security.password.newPasswordConfirm')"></b-input>
</b-field>
<b-button :loading="password.loading" class="is-danger" @click="changePassword">{{$t('settings.security.password.change')}}</b-button>
<hr>
<div class="subtitle">{{$t('settings.security.email.title')}}</div>
<p>{{$t('settings.security.email.current')}} {{$store.state.user.email}}</p>
<p>{{$t('settings.security.email.verified')}} <span v-if="!$store.state.user.emailVerified">{{$t('settings.security.email.verifiedFalse')}}<br><b-button :loading="resend.loading" @click="resendEmail()">{{$t('settings.security.resend.resend')}}</b-button></span> <span v-if="$store.state.user.emailVerified">{{$t('settings.security.email.verifiedTrue')}}</span></p>
<b-field :label="$t('settings.security.email.newEmail')">
<b-input type="email" v-model="email.newEmail" :placeholder="$t('settings.security.email.newEmail')"></b-input>
</b-field>
<b-field :label="$t('settings.security.password.oldPassword')">
<b-input type="password" minlength="6" maxlength="50" v-model="email.password" :placeholder="$t('settings.security.password.oldPassword')"></b-input>
</b-field>
<b-button :loading="email.loading" class="is-info" @click="changeEmail">{{$t('settings.security.email.change')}}</b-button>
<hr>
<div class="subtitle">{{$t('settings.security.session.title')}}</div>
<p>{{$t('settings.security.session.subtitle')}}</p>
<br>
<b-button :loading="session.loading" class="is-danger" @click="invalidateSessions()">{{$t('settings.security.session.invalidate')}}</b-button>
</div>
</div>
</template>
<script>
import AjaxErrorHandler from "@/assets/js/errorHandler";
import axios from "axios";
export default {
name: "SettingsAccount",
data() {
return {
password: {
oldPassword: '',
newPassword: '',
newPasswordConfirm: '',
loading: false
},
twoFactor: {
secret: '',
confirmCode: '',
enabled: false,
loading: false
},
email: {
newEmail: '',
password: '',
loading: false
},
resend: {
loading: false
},
session: {
loading: false
}
}
},
methods: {
changePassword() {
this.password.loading = true
this.axios.put(
process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_API_VERSION +
"/users/preferences", {
oldPassword: this.password.oldPassword,
newPassword: this.password.newPassword,
newPasswordConfirm: this.password.newPasswordConfirm
})
.then(() => {
this.password.loading = false
this.logout()
})
.catch((e) => {
this.password.loading = false
AjaxErrorHandler(this.$store)(e);
})
},
logout() {
this.$store.commit('issueLogout');
Object.assign(axios.defaults, {
headers: { Authorization: this.$store.state.user.token },
});
localStorage.removeItem("token");
this.$buefy.snackbar.open({
message: this.$t("errors.logout"),
type: "is-info",
});
},
changeEmail() {
this.email.loading = true
this.axios.put(
process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_API_VERSION +
"/users/preferences", {
password: this.email.password,
newEmail: this.email.newEmail
})
.then((res) => {
this.$store.commit('setEmail', res.data.email)
this.$store.commit('setEmailVerified', false)
this.axios.post(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + `users/recovery/send`)
.then(() => {
this.$buefy.snackbar.open({
message: this.$t("errors.verifySent"),
type: "is-info",
});
this.email.loading = false
})
})
.catch((e) => {
this.email.loading = false
AjaxErrorHandler(this.$store)(e);
})
},
resendEmail() {
this.resend.loading = true
this.axios.post(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + `users/verify/send`)
.then(() => {
this.$buefy.snackbar.open({
message: this.$t("errors.verifySent"),
type: "is-info",
});
this.resend.loading = false
})
.catch((e) => {
this.resend.loading = false
AjaxErrorHandler(this.$store)(e);
})
},
invalidateSessions() {
this.session.loading = true
this.axios.put(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + `users/preferences`, {
invalidateSession: true
})
.then(() => {
this.session.loading = false
this.logout()
})
.catch((e) => {
this.session.loading = false
AjaxErrorHandler(this.$store)(e);
})
}
}
}
</script>

View file

@ -75,7 +75,7 @@ export default {
} }
}, },
mounted() { mounted() {
this.axios.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'kaverti/stats') this.axios.get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'kaverti/stats')
.then(res => { .then(res => {
this.users = res.data.users this.users = res.data.users
this.posts = res.data.posts this.posts = res.data.posts

View file

@ -3,9 +3,10 @@
<section class="section"> <section class="section">
<div class="container"> <div class="container">
<div class="columns is-centered is-multiline" v-if="!loading"> <div class="columns is-centered is-multiline" v-if="!loading">
<div v-if="!teams.length" class="column"> <div class="column is-6" v-if="!teams.length">
<br /> <div class="box">
<NoItems :connection="true" type="users"> </NoItems> <NoItems :connection="true" type="teams"> </NoItems>
</div>
</div> </div>
<Pagination <Pagination
class="columns is-multiline" class="columns is-multiline"
@ -22,23 +23,11 @@
> >
<div class="box"> <div class="box">
<h1 class="title"> <h1 class="title">
{{ user.username }}&nbsp;<Badges <router-link :to="'/t/' + user.username" style="text-decoration: none; color: inherit;">{{ user.username }}</router-link>&nbsp;<Badges
:verified="user.verified" :verified="user.verified" :team="true"
></Badges> ></Badges>
</h1> </h1>
<img PLACEHOLDER IMAGE<br />
:src="
'https://cdn.kaverti.com/user/avatars/full/' +
user.picture +
'.png'
"
/><br />
<b-button
tag="router-link"
:to="'/u/' + user.username"
class="is-centered is-info"
>View Team</b-button
>
</div> </div>
</div> </div>
</Pagination> </Pagination>
@ -156,7 +145,7 @@ export default {
this.wait = true this.wait = true
} }
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'teams/' + '?offset=' + this.offset) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + '/' + 'teams/' + '?offset=' + this.offset)
.then(res => { .then(res => {
if(res.data < this.limit) { if(res.data < this.limit) {
this.offset = null; this.offset = null;

View file

@ -1,10 +1,16 @@
<template> <template>
<main> <div id="transactions">
<div class="section column"> <section class="section">
<div class="container" v-if="$store.state.user.username">
<div class="columns is-centered">
<div class="column is-6">
<div class="box"> <div class="box">
<h1 class="title">Transaction Log</h1> <div class="title">Transaction Log</div>
<hr />
<NoItems v-if="!transactions.length" type="transactions"></NoItems>
<b-table <b-table
:detail-key='"log-" + transactions.id' v-else
:detail-key="'log-' + transactions.id"
:data="transactions" :data="transactions"
:paginated="isPaginated" :paginated="isPaginated"
:per-page="perPage" :per-page="perPage"
@ -20,47 +26,73 @@
aria-next-label="Next page" aria-next-label="Next page"
aria-previous-label="Previous page" aria-previous-label="Previous page"
aria-page-label="Page" aria-page-label="Page"
aria-current-label="Current page"> >
<b-table-column
<b-table-column field="props.row.text" label="Message" sortable v-slot="props"> field="props.row.text"
label="Message"
sortable
v-slot="props"
>
{{ props.row.text }} {{ props.row.text }}
</b-table-column> </b-table-column>
<b-table-column
<b-table-column field="props.row.priceOfPurchase" label="Price" sortable v-slot="props"> field="props.row.priceOfPurchase"
label="Price"
sortable
v-slot="props"
>
{{ props.row.priceOfPurchase }} {{ props.row.priceOfPurchase }}
</b-table-column> </b-table-column>
<b-table-column field="props.row.createdAt" label="Date" sortable centered v-slot="props"> <b-table-column
field="props.row.createdAt"
label="Date"
sortable
centered
v-slot="props"
>
<span class="tag is-success"> <span class="tag is-success">
{{ new Date(props.row.createdAt).toLocaleDateString() }} {{ new Date(props.row.createdAt).toLocaleDateString() }}
</span> </span>
</b-table-column> </b-table-column>
</b-table> </b-table>
</div> </div>
<NoItems v-if="!transactions.length" type="transactions"></NoItems>
</div> </div>
</main> </div>
</div>
<div class="container" v-else>
<div class="columns is-centered">
<div class="column is-6">
<div class="box has-text-centered">
<i class="far fa-times-square large-icon"></i>
<div class="subtitle">{{ $t("generic.notLoggedIn") }}</div>
</div>
</div>
</div>
</div>
</section>
</div>
</template> </template>
<script> <script>
import AjaxErrorHandler from '.././assets/js/errorHandler'; import AjaxErrorHandler from ".././assets/js/errorHandler";
import NoItems from '../components/NoItems' import NoItems from "../components/NoItems";
export default { export default {
name: 'Transactions', name: "Transactions",
components: { components: {
NoItems NoItems,
}, },
data() { data() {
return { return {
search: '', search: "",
transactions: [], transactions: [],
isPaginated: true, isPaginated: true,
isPaginationSimple: false, isPaginationSimple: false,
isPaginationRounded: false, isPaginationRounded: false,
paginationPosition: 'bottom', paginationPosition: "bottom",
defaultSortDirection: 'desc', defaultSortDirection: "desc",
sortIcon: 'arrow-up', sortIcon: "arrow-up",
sortIconSize: 'is-small', sortIconSize: "is-small",
currentPage: 1, currentPage: 1,
perPage: 30, perPage: 30,
defaultOpenedDetails: [1], defaultOpenedDetails: [1],
@ -71,49 +103,53 @@ export default {
limit: 15, limit: 15,
showTeamTab: 0, showTeamTab: 0,
tcreateProd: { tcreateProd: {
username: '', username: "",
name: '', name: "",
loading: false, loading: false,
errors: { errors: {
username: '', username: "",
name: '' name: "",
} },
}, },
roleOptions: [ roleOptions: [
{ name: 'Admins', value: 'admin' }, { name: "Admins", value: "admin" },
{ name: 'transactions', value: 'user' } { name: "transactions", value: "user" },
], ],
roleSelected: ['admin', 'user'], roleSelected: ["admin", "user"],
tableSort: { tableSort: {
column: 'username', column: "username",
sort: 'desc' sort: "desc",
} },
} };
}, },
methods: { methods: {
fetchData() { fetchData() {
if (this.offset === null) return; if (this.offset === null) return;
let url = process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `transactions? let url =
process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_API_VERSION +
`/` +
`transactions?
sort=${this.tableSort.column} sort=${this.tableSort.column}
&order=${this.tableSort.sort} &order=${this.tableSort.sort}
&offset=${this.offset} &offset=${this.offset}
`; `;
if (this.roleSelected.length === 1) { if (this.roleSelected.length === 1) {
url += '&role=' + this.roleSelected[0]; url += "&role=" + this.roleSelected[0];
} }
if (this.search.length) { if (this.search.length) {
url += '&search=' + encodeURIComponent(this.search.trim()); url += "&search=" + encodeURIComponent(this.search.trim());
} }
this.loading = true; this.loading = true;
this.axios this.axios
.get(url) .get(url)
.then(res => { .then((res) => {
this.transactions.push(...res.data); this.transactions.push(...res.data);
this.loading = /*loading =*/ false; this.loading = /*loading =*/ false;
@ -125,7 +161,7 @@ export default {
this.offset += this.limit; this.offset += this.limit;
} }
}) })
.catch(e => { .catch((e) => {
AjaxErrorHandler(this.$store)(e); AjaxErrorHandler(this.$store)(e);
this.loading = /*loading =*/ false; this.loading = /*loading =*/ false;
}); });
@ -135,26 +171,35 @@ export default {
this.transactions = []; this.transactions = [];
this.fetchData(); this.fetchData();
} },
}, },
getNewertransactions() { getNewertransactions() {
this.loadingNewer = true this.loadingNewer = true;
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + '/' + 'transactions' + '?limit=' + this.newtransactions) .get(
.then(res => { process.env.VUE_APP_API_ENDPOINT +
this.loadingNewer = false process.env.VUE_APP_API_VERSION +
this.newtransactions = 0 "/" +
"transactions" +
"?limit=" +
this.newtransactions
)
.then((res) => {
this.loadingNewer = false;
this.newtransactions = 0;
this.threads.unshift(...res.data.Threads) this.threads.unshift(...res.data.Threads);
}) })
.catch((e) => { .catch((e) => {
this.loadingNewer = false this.loadingNewer = false;
AjaxErrorHandler(this.$store)(e) AjaxErrorHandler(this.$store)(e);
}) });
}, },
mounted() { mounted() {
if (this.$store.state.user.username) {
this.fetchData(); this.fetchData();
} }
} },
};
</script> </script>

View file

@ -3,7 +3,7 @@
<section class="section"> <section class="section">
<div class="container"> <div class="container">
<div class="columns is-centered" v-if="exists"> <div class="columns is-centered" v-if="exists">
<div class="column is-3 is-vcentered has-text-centered"> <div class="column is-4 is-vcentered has-text-centered">
<h1 class="title"> <h1 class="title">
{{ user.username }}&nbsp;<Badges {{ user.username }}&nbsp;<Badges
:username="user.username" :username="user.username"
@ -95,7 +95,7 @@
{{ $t("user.marketplace") }}: {{ $t("user.marketplace") }}:
</div> </div>
</div> </div>
<div class="column is-6 is-vcentered has-text-centered"> <div class="column is-8 is-vcentered has-text-centered">
<h1 class="title">{{ $t("user.more") }} {{ user.username }}</h1> <h1 class="title">{{ $t("user.more") }} {{ user.username }}</h1>
<div> <div>
<div class="tabs"> <div class="tabs">
@ -224,8 +224,8 @@ export default {
fetchData() { fetchData() {
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
`/` + `/` +
`user/${this.$route.params.username}` `user/${this.$route.params.username}`
) )
@ -243,8 +243,8 @@ export default {
}); });
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
`/` + `/` +
"relationships/get/" + "relationships/get/" +
this.$route.params.username this.$route.params.username
@ -254,8 +254,8 @@ export default {
scrubDesc() { scrubDesc() {
this.axios this.axios
.put( .put(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
"/" + "/" +
"admin/user/scrub", "admin/user/scrub",
{ {
@ -271,8 +271,8 @@ export default {
refreshAvatar() { refreshAvatar() {
this.axios this.axios
.put( .put(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
"/" + "/" +
"admin/user/avatar", "admin/user/avatar",
{ {
@ -287,8 +287,8 @@ export default {
scrubUsername() { scrubUsername() {
this.axios this.axios
.put( .put(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
"/" + "/" +
"admin/user/scrub", "admin/user/scrub",
{ {
@ -305,8 +305,8 @@ export default {
this.relationships.type === ""; this.relationships.type === "";
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
`/` + `/` +
`relationships/get/${this.$route.params.username}` `relationships/get/${this.$route.params.username}`
) )
@ -315,8 +315,8 @@ export default {
removeFriend() { removeFriend() {
this.axios this.axios
.put( .put(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
"/" + "/" +
"relationships/remove", "relationships/remove",
{ {
@ -328,8 +328,8 @@ export default {
this.description.loading = false; this.description.loading = false;
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
`/` + `/` +
`relationships/get/${this.$route.params.username}` `relationships/get/${this.$route.params.username}`
) )
@ -356,8 +356,8 @@ export default {
}); });
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
`/` + `/` +
`relationships/get/${this.$route.params.username}` `relationships/get/${this.$route.params.username}`
) )
@ -379,8 +379,8 @@ export default {
doRelationship() { doRelationship() {
this.axios this.axios
.post( .post(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
"/" + "/" +
"relationships/send", "relationships/send",
{ {
@ -392,8 +392,8 @@ export default {
this.description.loading = false; this.description.loading = false;
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
`/` + `/` +
`relationships/get/${this.$route.params.username}` `relationships/get/${this.$route.params.username}`
) )
@ -417,8 +417,8 @@ export default {
AjaxErrorHandler(this.$store)(e); AjaxErrorHandler(this.$store)(e);
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
`/` + `/` +
`relationships/get/${this.$route.params.username}` `relationships/get/${this.$route.params.username}`
) )
@ -439,8 +439,8 @@ export default {
doRelationshipAccept() { doRelationshipAccept() {
this.axios this.axios
.put( .put(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
"/" + "/" +
"relationships/accept", "relationships/accept",
{ {
@ -452,8 +452,8 @@ export default {
this.description.loading = false; this.description.loading = false;
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
`/` + `/` +
`relationships/get/${this.$route.params.username}` `relationships/get/${this.$route.params.username}`
) )
@ -479,8 +479,8 @@ export default {
}); });
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
`/` + `/` +
`relationships/get/${this.$route.params.username}` `relationships/get/${this.$route.params.username}`
) )
@ -517,8 +517,8 @@ export default {
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
`/` + `/` +
`user/${this.$route.params.username}` `user/${this.$route.params.username}`
) )
@ -526,8 +526,8 @@ export default {
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
`/` + `/` +
`relationships/get/${this.$route.params.username}` `relationships/get/${this.$route.params.username}`
) )

View file

@ -34,7 +34,7 @@ export default {
}, },
mounted() { mounted() {
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `user/${this.$route.params.username}?awards=true`) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + `user/${this.$route.params.username}?awards=true`)
.then(res => { .then(res => {
this.awards = res.data this.awards = res.data
}) })

View file

@ -27,7 +27,7 @@ export default {
}, },
mounted() { mounted() {
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + 'relationships/user/' + this.$route.params.username) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + 'relationships/user/' + this.$route.params.username)
.then(res => { .then(res => {
this.friends = res.data this.friends = res.data
}) })

View file

@ -33,7 +33,7 @@ export default {
}, },
mounted() { mounted() {
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `user/${this.$route.params.username}?sort=username&order=desc&offset=234243&inventory=true`) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + `user/${this.$route.params.username}?sort=username&order=desc&offset=234243&inventory=true`)
.then(res => { .then(res => {
this.inventory = res.data.Inventories this.inventory = res.data.Inventories
}) })

View file

@ -80,7 +80,7 @@ export default {
this.$store.dispatch('setTitle', this.$route.params.username + ' - Posts') this.$store.dispatch('setTitle', this.$route.params.username + ' - Posts')
this.axios this.axios
.get(process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_APIVERSION + `/` + `user/${this.$route.params.username}?posts=true`) .get(process.env.VUE_APP_API_ENDPOINT + process.env.VUE_APP_API_VERSION + `/` + `user/${this.$route.params.username}?posts=true`)
.then(res => { .then(res => {
this.posts = res.data.Posts this.posts = res.data.Posts
this.nextURL = res.data.meta.nextURL this.nextURL = res.data.meta.nextURL

View file

@ -3,10 +3,11 @@
<section class="section"> <section class="section">
<div class="container"> <div class="container">
<div class="columns is-centered is-multiline" v-if="!loading"> <div class="columns is-centered is-multiline" v-if="!loading">
<div v-if="!users.length" class="column"> <div class="column is-6" v-if="!users.length">
<br /> <div class="box">
<NoItems :connection="true" type="users"> </NoItems> <NoItems :connection="true" type="users"> </NoItems>
</div> </div>
</div>
<Pagination <Pagination
class="columns is-multiline" class="columns is-multiline"
v-if="users.length" v-if="users.length"
@ -29,6 +30,7 @@
:admin="user.admin" :admin="user.admin"
:booster="user.booster" :booster="user.booster"
:bot="user.bot" :bot="user.bot"
:user="true"
></Badges> ></Badges>
</h1> </h1>
<img <img
@ -163,8 +165,8 @@ export default {
} }
this.axios this.axios
.get( .get(
process.env.VUE_APP_APIENDPOINT + process.env.VUE_APP_API_ENDPOINT +
process.env.VUE_APP_APIVERSION + process.env.VUE_APP_API_VERSION +
"/" + "/" +
"user/" + "user/" +
"?offset=" + "?offset=" +

66
vue.config.example.js Normal file
View file

@ -0,0 +1,66 @@
const Dotenv = require('dotenv-webpack');
var WebpackAutoInject = require('webpack-auto-inject-version');
const fs = require("fs");
module.exports = {
devServer: {
proxy: 'http://localhost:23981',
//disableHostCheck: true, // dev.kaverti.flowinity
//host: 'dev.kaverti.flowinity',
/*
https: {
cert: fs.readFileSync('C:/ssl/troplo/certificate.crt'),
key: fs.readFileSync('C:/ssl/troplo/private.key'),
}
*/
},
publicPath: '/',
productionSourceMap: false,
configureWebpack: {
plugins: [
new Dotenv(),
new WebpackAutoInject({
// specify the name of the tag in the outputed files eg
// bundle.js: [SHORT] Version: 0.13.36 ...
SHORT: 'Kaverti AIV',
SILENT: false,
PACKAGE_JSON_PATH: './package.json',
PACKAGE_JSON_INDENT: 4,
components: {
AutoIncreaseVersion: true,
InjectAsComment: true,
InjectByTag: true
},
componentsOptions: {
AutoIncreaseVersion: {
runInWatchMode: true // it will increase version with every single build!
},
InjectAsComment: {
tag: 'Kaverti Version: {version}, Build Date: {date}',
dateFormat: 'dd/mm/yyyy; hh:MM:ss TT', // change timezone: `UTC:h:MM:ss` or `GMT:h:MM:ss`
multiLineCommentType: false, // use `/** */` instead of `//` as comment block
},
InjectByTag: {
fileRegex: /\.+/,
AIVTagRegexp: /(\[AIV])(([a-zA-Z{} ,:;!()_@\-"'\\\/])+)(\[\/AIV])/g,
dateFormat: 'dd/mm/yyyy; hh:MM:ss TT'
}
},
LOGS_TEXT: {
AIS_START: 'Kaverti AIV started'
}
})
]
},
pluginOptions: {
i18n: {
locale: 'en',
fallbackLocale: 'debug',
localeDir: 'locales',
enableInSFC: false
}
}
}

View file

@ -1,24 +0,0 @@
const Dotenv = require('dotenv-webpack');
module.exports = {
devServer: {
proxy: 'http://localhost:23982'
},
publicPath: '/',
productionSourceMap: false,
configureWebpack: {
plugins: [
new Dotenv()
]
},
pluginOptions: {
i18n: {
locale: 'en',
fallbackLocale: 'debug',
localeDir: 'locales',
enableInSFC: false
}
}
}

View file

@ -11729,6 +11729,11 @@ wcwidth@^1.0.1:
dependencies: dependencies:
defaults "^1.0.3" defaults "^1.0.3"
webpack-auto-inject-version@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/webpack-auto-inject-version/-/webpack-auto-inject-version-1.2.2.tgz#8fa15f6ea7c4a2a4adcdc5d8b1dc47693dddc971"
integrity sha512-duFSWzZe/OY8zyr2DpymzZeY8yI1RSZ9hu9wDwZy/fhxwntgpEzTwyIB/U7ig+FB26mif8xx5zS1E3Co9c5cYA==
webpack-bundle-analyzer@^3.8.0: webpack-bundle-analyzer@^3.8.0:
version "3.9.0" version "3.9.0"
resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz#f6f94db108fb574e415ad313de41a2707d33ef3c" resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz#f6f94db108fb574e415ad313de41a2707d33ef3c"