Compare commits

..

No commits in common. "0.9.0" and "0.8.3" have entirely different histories.
0.9.0 ... 0.8.3

4 changed files with 78 additions and 330 deletions

View File

@ -2,17 +2,9 @@
All notable changes to this project will be documented in this file. Dates are displayed in UTC. All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [0.9.0](https://git.odit.services/lfk/selfservice/compare/0.8.3...0.9.0)
- wip: error registration ui feedback [`9ac14e8`](https://git.odit.services/lfk/selfservice/commit/9ac14e8a5d740fb4cd87645e69b2cfde73e4acc7)
- wip: registration confirmation ui [`8928f84`](https://git.odit.services/lfk/selfservice/commit/8928f841dcd370daf28416adbf1adbe16fa4d76f)
#### [0.8.3](https://git.odit.services/lfk/selfservice/compare/0.8.2...0.8.3) #### [0.8.3](https://git.odit.services/lfk/selfservice/compare/0.8.2...0.8.3)
> 3 February 2023
- fix: registration code (broke in merge) [`123509d`](https://git.odit.services/lfk/selfservice/commit/123509d0a6d15fe254e28f7a316bd6c260fe7bd2) - fix: registration code (broke in merge) [`123509d`](https://git.odit.services/lfk/selfservice/commit/123509d0a6d15fe254e28f7a316bd6c260fe7bd2)
- 🚀Bumped version to v0.8.3 [`4a5b9d2`](https://git.odit.services/lfk/selfservice/commit/4a5b9d25698931158a602b2159b4e6c4fa129e8e)
- wip: fix registration code [`51f8d0f`](https://git.odit.services/lfk/selfservice/commit/51f8d0fb42d0dbba268799eb9385686d22fd2284) - wip: fix registration code [`51f8d0f`](https://git.odit.services/lfk/selfservice/commit/51f8d0fb42d0dbba268799eb9385686d22fd2284)
#### [0.8.2](https://git.odit.services/lfk/selfservice/compare/0.8.1...0.8.2) #### [0.8.2](https://git.odit.services/lfk/selfservice/compare/0.8.1...0.8.2)

View File

@ -1,6 +1,6 @@
{ {
"name": "@odit/lfk-selfservice", "name": "@odit/lfk-selfservice",
"version": "0.9.0", "version": "0.8.3",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build",

View File

@ -3,6 +3,7 @@ import Home from './views/Home.vue';
import Imprint from './views/Imprint.vue'; import Imprint from './views/Imprint.vue';
import Privacy from './views/Privacy.vue'; import Privacy from './views/Privacy.vue';
import Register from './views/Register.vue'; import Register from './views/Register.vue';
import Registered from './views/Registered.vue';
import Profile from './views/Profile.vue'; import Profile from './views/Profile.vue';
import ProfileNone from './views/ProfileNone.vue'; import ProfileNone from './views/ProfileNone.vue';
@ -17,6 +18,7 @@ export const routes = [
{ path: config.baseurl_selfservice + 'privacy/', component: Privacy }, { path: config.baseurl_selfservice + 'privacy/', component: Privacy },
{ path: config.baseurl_selfservice + 'register', component: Register }, { path: config.baseurl_selfservice + 'register', component: Register },
{ path: config.baseurl_selfservice + 'register/', component: Register }, { path: config.baseurl_selfservice + 'register/', component: Register },
{ path: config.baseurl_selfservice + 'registered/:mail', component: Registered, props: true },
{ path: config.baseurl_selfservice + 'register/:token', component: Register, props: true }, { path: config.baseurl_selfservice + 'register/:token', component: Register, props: true },
{ path: config.baseurl_selfservice + 'profile', component: Profile }, { path: config.baseurl_selfservice + 'profile', component: Profile },
{ path: config.baseurl_selfservice + 'profile/', component: ProfileNone }, { path: config.baseurl_selfservice + 'profile/', component: ProfileNone },

View File

@ -1,73 +1,33 @@
<template> <template>
<div <div class="min-h-screen flex items-center justify-center">
class="min-h-screen flex items-center justify-center"
v-if="registrationState === 'registered'"
>
<div class="max-w-md w-full py-12 px-6"> <div class="max-w-md w-full py-12 px-6">
<img class="mx-auto h-24 w-auto" src="/favicon.png" alt /> <img class="mx-auto h-24 w-auto" src="/favicon.png" alt />
<h1 class="sm:text-3xl text-2xl font-medium title-font mb-4 text-center"> <h1
Lauf für Kaya! - Registriert class="sm:text-3xl text-2xl font-medium title-font mb-4 text-center"
</h1> >Lauf für Kaya! - {{ $t('registrieren') }}</h1>
<p class="mx-auto leading-relaxed text-base text-center"> <p class="mx-auto leading-relaxed text-base text-center">{{ $t('register.register_now') }}</p>
Bitte klicken Sie zum Fortfahren auf den Link, den wir an
<b class="font-bold">{{ userdetails.mail }}</b> geschickt haben.
</p>
</div>
</div>
<div class="min-h-screen flex items-center justify-center" v-else>
<div class="max-w-md w-full py-12 px-6">
<img class="mx-auto h-24 w-auto" src="/favicon.png" alt />
<h1 class="sm:text-3xl text-2xl font-medium title-font mb-4 text-center">
Lauf für Kaya! - {{ $t("registrieren") }}
</h1>
<p class="mx-auto leading-relaxed text-base text-center">
{{ $t("register.register_now") }}
</p>
<p <p
v-if="state.org_name !== ''" v-if="state.org_name !== ''"
class="mx-auto leading-relaxed text-base text-center" class="mx-auto leading-relaxed text-base text-center"
> >{{ $t('organization') }}: {{ state.org_name }}</p>
{{ $t("organization") }}: {{ state.org_name }}
</p>
<p <p
v-if="state.org_name !== '' && state.org_teams.length > 0" v-if="state.org_name !== '' && state.org_teams.length > 0"
class="mx-auto leading-relaxed text-base text-center" class="mx-auto leading-relaxed text-base text-center"
> >Team:</p>
Team:
</p>
<select <select
v-model="org_team" v-model="org_team"
v-if="state.org_name !== '' && state.org_teams.length > 0" v-if="state.org_name !== '' && state.org_teams.length > 0"
class=" class="w-full border bg-white rounded px-3 py-2 outline-none block mt-1 text-sm dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700 form-select focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray"
w-full
border
bg-white
rounded
px-3
py-2
outline-none
block
mt-1
text-sm
dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700
form-select
focus:border-purple-400 focus:outline-none focus:shadow-outline-purple
dark:focus:shadow-outline-gray
"
> >
<option v-for="t in state.org_teams" :key="t.id" :value="t.id"> <option v-for="t in state.org_teams" :key="t.id" :value="t.id">{{ t.name }}</option>
{{ t.name }}
</option>
</select> </select>
<p <p
v-if="state.org_name === ''" v-if="state.org_name === ''"
class="mx-auto leading-relaxed text-base text-center" class="mx-auto leading-relaxed text-base text-center"
> >Bürgerlauf</p>
Bürgerlauf
</p>
<div class="mt-4"> <div class="mt-4">
<label for="first_name" class="block font-medium"> <label for="first_name" class="block font-medium">
{{ $t("vorname") }} {{ $t('vorname') }}
<span class="font-bold">*</span> <span class="font-bold">*</span>
</label> </label>
<input <input
@ -77,28 +37,11 @@
autocomplete="off" autocomplete="off"
:placeholder="[[$t('vorname')]]" :placeholder="[[$t('vorname')]]"
type="text" type="text"
:class="{ :class="{ 'border-red-500': (!userdetails.firstname.trim()), 'border-green-300': (userdetails.firstname.trim()) }"
'border-red-500': !userdetails.firstname.trim(), class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2"
'border-green-300': userdetails.firstname.trim(),
}"
class="
dark:bg-gray-800
mt-1
block
w-full
shadow-sm
sm:text-sm
border-gray-300 border-2
bg-gray-50
text-gray-500
rounded-md
p-2
"
/> />
<!-- --> <!-- -->
<label for="middle_name" class="block font-medium">{{ <label for="middle_name" class="block font-medium">{{ $t('mittelname') }}</label>
$t("mittelname")
}}</label>
<input <input
v-model="userdetails.middlename" v-model="userdetails.middlename"
name="middlename" name="middlename"
@ -106,23 +49,11 @@
autocomplete="off" autocomplete="off"
:placeholder="[[$t('mittelname')]]" :placeholder="[[$t('mittelname')]]"
type="text" type="text"
class=" class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2"
dark:bg-gray-800
mt-1
block
w-full
shadow-sm
sm:text-sm
border-gray-300 border-2
bg-gray-50
text-gray-500
rounded-md
p-2
"
/> />
<!-- --> <!-- -->
<label for="last_name" class="block font-medium"> <label for="last_name" class="block font-medium">
{{ $t("nachname") }} {{ $t('nachname') }}
<span class="font-bold">*</span> <span class="font-bold">*</span>
</label> </label>
<input <input
@ -132,27 +63,12 @@
autocomplete="off" autocomplete="off"
:placeholder="[[$t('nachname')]]" :placeholder="[[$t('nachname')]]"
type="text" type="text"
:class="{ :class="{ 'border-red-500': (!userdetails.lastname.trim()), 'border-green-300': (userdetails.lastname.trim()) }"
'border-red-500': !userdetails.lastname.trim(), class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2"
'border-green-300': userdetails.lastname.trim(),
}"
class="
dark:bg-gray-800
mt-1
block
w-full
shadow-sm
sm:text-sm
border-gray-300 border-2
bg-gray-50
text-gray-500
rounded-md
p-2
"
/> />
<!-- --> <!-- -->
<label for="email_address" class="block font-medium"> <label for="email_address" class="block font-medium">
{{ $t("e_mail_adress") }} {{ $t('e_mail_adress') }}
<span class="font-bold">*</span> <span class="font-bold">*</span>
</label> </label>
<input <input
@ -162,31 +78,12 @@
autocomplete="off" autocomplete="off"
:placeholder="[[$t('e_mail_adress')]]" :placeholder="[[$t('e_mail_adress')]]"
type="email" type="email"
:class="{ :class="{ 'border-red-500': (!isEmail(userdetails.mail)), 'border-green-300': (isEmail(userdetails.mail)) }"
'border-red-500': !isEmail(userdetails.mail), class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-2 bg-gray-50 text-gray-500 rounded-md p-2"
'border-green-300': isEmail(userdetails.mail),
}"
class="
dark:bg-gray-800
mt-1
block
w-full
shadow-sm
sm:text-sm
border-2
bg-gray-50
text-gray-500
rounded-md
p-2
"
/> />
<p v-if="!isEmail(userdetails.mail)" class="text-sm"> <p v-if="!isEmail(userdetails.mail)" class="text-sm">{{ $t('please_provide_valid_mail') }}</p>
{{ $t("please_provide_valid_mail") }}
</p>
<!-- --> <!-- -->
<label for="phone" class="select-none block font-medium">{{ <label for="phone" class="select-none block font-medium">{{ $t('phone_number') }}</label>
$t("phone_number")
}}</label>
<input <input
v-model="userdetails.phone" v-model="userdetails.phone"
name="phone" name="phone"
@ -194,32 +91,13 @@
autocomplete="off" autocomplete="off"
:placeholder="[[$t('phone_number')]]" :placeholder="[[$t('phone_number')]]"
type="text" type="text"
:class="{ :class="{ 'border-red-500': (!isMobilePhone(userdetails.phone) && userdetails.phone.trim()), 'border-green-300': (isMobilePhone(userdetails.phone) && userdetails.phone.trim()) }"
'border-red-500': class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-2 bg-gray-50 text-gray-500 rounded-md p-2"
!isMobilePhone(userdetails.phone) && userdetails.phone.trim(),
'border-green-300':
isMobilePhone(userdetails.phone) && userdetails.phone.trim(),
}"
class="
dark:bg-gray-800
mt-1
block
w-full
shadow-sm
sm:text-sm
border-2
bg-gray-50
text-gray-500
rounded-md
p-2
"
/> />
<p <p
v-if="!isMobilePhone(userdetails.phone) && userdetails.phone.trim()" v-if="(!isMobilePhone(userdetails.phone) && userdetails.phone.trim())"
class="text-sm" class="text-sm"
> >{{ $t('this_is_not_a_valid_international_phone_number') }}</p>
{{ $t("this_is_not_a_valid_international_phone_number") }}
</p>
<!-- --> <!-- -->
<div class="grid grid-cols-6 mt-6"> <div class="grid grid-cols-6 mt-6">
<div class="col-span-6"></div> <div class="col-span-6"></div>
@ -237,14 +115,13 @@
<label <label
for="address_activated" for="address_activated"
class="font-medium text-gray-400 select-none" class="font-medium text-gray-400 select-none"
>{{ $t("provide_address") }}</label >{{ $t('provide_address') }}</label>
>
</div> </div>
</div> </div>
<div v-if="provide_address === true" class="col-span-6"> <div v-if="provide_address === true" class="col-span-6">
<div class="col-span-6"> <div class="col-span-6">
<label for="street" class="block font-medium"> <label for="street" class="block font-medium">
{{ $t("strasse") }} {{ $t('strasse') }}
<span class="font-bold">*</span> <span class="font-bold">*</span>
</label> </label>
<input <input
@ -254,29 +131,12 @@
:placeholder="[[$t('strasse')]]" :placeholder="[[$t('strasse')]]"
id="street" id="street"
autocomplete="street-address" autocomplete="street-address"
:class="{ :class="{ 'border-red-500': (!userdetails.address.street.trim()), 'border-green-300': (userdetails.address.street.trim()) }"
'border-red-500': !userdetails.address.street.trim(), class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2"
'border-green-300': userdetails.address.street.trim(),
}"
class="
dark:bg-gray-800
mt-1
block
w-full
shadow-sm
sm:text-sm
border-gray-300 border-2
bg-gray-50
text-gray-500
rounded-md
p-2
"
/> />
</div> </div>
<div class="col-span-6"> <div class="col-span-6">
<label for="address2" class="block font-medium">{{ <label for="address2" class="block font-medium">{{ $t('apartment_suite_etc') }}</label>
$t("apartment_suite_etc")
}}</label>
<input <input
v-model="userdetails.address.address2" v-model="userdetails.address.address2"
type="text" type="text"
@ -284,24 +144,12 @@
:placeholder="[[$t('apartment_suite_etc')]]" :placeholder="[[$t('apartment_suite_etc')]]"
id="address2" id="address2"
autocomplete="street-address" autocomplete="street-address"
class=" class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2"
dark:bg-gray-800
mt-1
block
w-full
shadow-sm
sm:text-sm
border-gray-300 border-2
bg-gray-50
text-gray-500
rounded-md
p-2
"
/> />
</div> </div>
<div class="col-span-6 sm:col-span-6 lg:col-span-2"> <div class="col-span-6 sm:col-span-6 lg:col-span-2">
<label for="city" class="block font-medium"> <label for="city" class="block font-medium">
{{ $t("ort") }} {{ $t('ort') }}
<span class="font-bold">*</span> <span class="font-bold">*</span>
</label> </label>
<input <input
@ -310,28 +158,13 @@
name="city" name="city"
:placeholder="[[$t('ort')]]" :placeholder="[[$t('ort')]]"
id="city" id="city"
:class="{ :class="{ 'border-red-500': (!userdetails.address.city.trim()), 'border-green-300': (userdetails.address.city.trim()) }"
'border-red-500': !userdetails.address.city.trim(), class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2"
'border-green-300': userdetails.address.city.trim(),
}"
class="
dark:bg-gray-800
mt-1
block
w-full
shadow-sm
sm:text-sm
border-gray-300 border-2
bg-gray-50
text-gray-500
rounded-md
p-2
"
/> />
</div> </div>
<div class="col-span-6 sm:col-span-3 lg:col-span-2"> <div class="col-span-6 sm:col-span-3 lg:col-span-2">
<label for="postal_code" class="block font-medium"> <label for="postal_code" class="block font-medium">
{{ $t("plz") }} {{ $t('plz') }}
<span class="font-bold">*</span> <span class="font-bold">*</span>
</label> </label>
<input <input
@ -341,37 +174,14 @@
:placeholder="[[$t('plz')]]" :placeholder="[[$t('plz')]]"
id="postal_code" id="postal_code"
autocomplete="postal-code" autocomplete="postal-code"
:class="{ :class="{ 'border-red-500': (!isPostalCode(userdetails.address.zipcode, 'DE')), 'border-green-300': (isPostalCode(userdetails.address.zipcode, 'DE')) }"
'border-red-500': !isPostalCode( class="dark:bg-gray-800 mt-1 block w-full shadow-sm sm:text-sm border-gray-300 border-2 bg-gray-50 text-gray-500 rounded-md p-2"
userdetails.address.zipcode,
'DE'
),
'border-green-300': isPostalCode(
userdetails.address.zipcode,
'DE'
),
}"
class="
dark:bg-gray-800
mt-1
block
w-full
shadow-sm
sm:text-sm
border-gray-300 border-2
bg-gray-50
text-gray-500
rounded-md
p-2
"
/> />
</div> </div>
<p <p
v-if="!isPostalCode(userdetails.address.zipcode, 'DE')" v-if="!isPostalCode(userdetails.address.zipcode, 'DE')"
class="text-sm" class="text-sm"
> >{{ $t('please_provide_a_valid_zipcode') }}</p>
{{ $t("please_provide_a_valid_zipcode") }}
</p>
</div> </div>
</div> </div>
<div class="flex items-start mt-6"> <div class="flex items-start mt-6">
@ -385,19 +195,15 @@
/> />
</div> </div>
<div class="ml-3 text-sm"> <div class="ml-3 text-sm">
<label <label for="agb_accepted" class="font-medium text-gray-400 select-none">
for="agb_accepted" {{ $t('i_accept', { tos: $t('tos') }) }}
class="font-medium text-gray-400 select-none"
>
{{ $t("i_accept", { tos: $t("tos") }) }}
<a <a
target="_blank" target="_blank"
rel="noreferrer,noopener" rel="noreferrer,noopener"
href="https://lauf-fuer-kaya.de/datenschutz/" href="https://lauf-fuer-kaya.de/datenschutz/"
class="underline" class="underline"
>{{ $t("tos") }}</a >{{ $t('tos') }}</a>
> {{ $t('i_accept_end') }}
{{ $t("i_accept_end") }}
<span class="font-bold">*</span> <span class="font-bold">*</span>
</label> </label>
</div> </div>
@ -413,11 +219,8 @@
/> />
</div> </div>
<div class="ml-3 text-sm"> <div class="ml-3 text-sm">
<label <label for="data_confirmed" class="font-medium text-gray-400 select-none">
for="data_confirmed" {{ $t('confirm_personal_data') }}
class="font-medium text-gray-400 select-none"
>
{{ $t("confirm_personal_data") }}
<span class="font-bold">*</span> <span class="font-bold">*</span>
</label> </label>
</div> </div>
@ -425,30 +228,10 @@
<div class="mt-6"> <div class="mt-6">
<button <button
@click="login" @click="login"
:disabled="!state.submit_enabled" :disabled="(!state.submit_enabled)"
:class="{ :class="{ 'opacity-50': (!state.submit_enabled), 'cursor-not-allowed': (!state.submit_enabled) }"
'opacity-50': !state.submit_enabled, class="text-white block w-full text-center py-2 px-3 border-2 border-gray-300 rounded-md p-1 bg-blue-800 font-medium hover:border-gray-400 focus:outline-none focus:border-gray-400 sm:text-sm"
'cursor-not-allowed': !state.submit_enabled, >{{ $t('registrieren') }}</button>
}"
class="
text-white
block
w-full
text-center
py-2
px-3
border-2 border-gray-300
rounded-md
p-1
bg-blue-800
font-medium
hover:border-gray-400
focus:outline-none focus:border-gray-400
sm:text-sm
"
>
{{ $t("registrieren") }}
</button>
</div> </div>
</div> </div>
</div> </div>
@ -458,17 +241,16 @@
<script setup> <script setup>
import { computed, ref, reactive, defineProps } from "vue"; import { computed, ref, reactive, defineProps } from "vue";
import axios from "redaxios"; import axios from "redaxios";
import isEmail from "validator/es/lib/isEmail"; import isEmail from 'validator/es/lib/isEmail';
import isMobilePhone from "validator/es/lib/isMobilePhone"; import isMobilePhone from 'validator/es/lib/isMobilePhone';
import isPostalCode from "validator/es/lib/isPostalCode"; import isPostalCode from 'validator/es/lib/isPostalCode';
import { TYPE, useToast } from "vue-toastification"; import { useToast } from "vue-toastification";
const props = defineProps({ const props = defineProps({
token: String, token: String
}); })
if (props.token) { if (props.token) {
axios axios.get(`${config.baseurl}api/organizations/selfservice/${props.token}`)
.get(`${config.baseurl}api/organizations/selfservice/${props.token}`)
.then(({ data }) => { .then(({ data }) => {
state.org_name = data.name; state.org_name = data.name;
state.org_teams = data.teams; state.org_teams = data.teams;
@ -479,51 +261,31 @@ if (props.token) {
}); });
} }
let userdetails = ref({ let userdetails = ref({ firstname: "", lastname: "", middlename: "", mail: "", phone: "", address: { street: "", address2: "", city: "", zipcode: "" } });
firstname: "",
lastname: "",
middlename: "",
mail: "",
phone: "",
address: { street: "", address2: "", city: "", zipcode: "" },
});
let provide_address = ref(false); let provide_address = ref(false);
let agb_accepted = ref(false); let agb_accepted = ref(false);
let data_confirmed = ref(false); let data_confirmed = ref(false);
let org_team = ref(""); let org_team = ref("");
let registrationState = ref("pending"); //
//
const state = reactive({ const state = reactive({
org_name: "", org_name: "",
org_teams: [], org_teams: [],
submit_enabled: computed( submit_enabled: computed(() => agb_accepted.value === true && data_confirmed.value === true && (isMobilePhone(userdetails.value.phone) || !userdetails.value.phone.trim()) && isEmail(userdetails.value.mail)
() => && userdetails.value.firstname
agb_accepted.value === true && && userdetails.value.lastname && (provide_address.value === false || provide_address.value === true && (userdetails.value.address.street.trim() && userdetails.value.address.city.trim() && isPostalCode(userdetails.value.address.zipcode, "DE"))))
data_confirmed.value === true && })
(isMobilePhone(userdetails.value.phone) ||
!userdetails.value.phone.trim()) &&
isEmail(userdetails.value.mail) &&
userdetails.value.firstname &&
userdetails.value.lastname &&
(provide_address.value === false ||
(provide_address.value === true &&
userdetails.value.address.street.trim() &&
userdetails.value.address.city.trim() &&
isPostalCode(userdetails.value.address.zipcode, "DE")))
),
});
const toast = useToast(); const toast = useToast();
function login() { function login() {
userdetails = userdetails.value; userdetails = userdetails.value;
if (userdetails?.phone === "" || isMobilePhone(userdetails.phone)) { if (userdetails?.phone === "" || isMobilePhone(userdetails.phone)) {
if (isEmail(userdetails.mail)) { if (isEmail(userdetails.mail)) {
let postdata = { let postdata = {
email: userdetails.mail, "email": userdetails.mail,
firstname: userdetails.firstname, "firstname": userdetails.firstname,
middlename: userdetails.middlename, "middlename": userdetails.middlename,
lastname: userdetails.lastname, "lastname": userdetails.lastname,
address: {}, "address": {}
}; }
if (isMobilePhone(userdetails.phone)) { if (isMobilePhone(userdetails.phone)) {
postdata.phone = userdetails.phone; postdata.phone = userdetails.phone;
} }
@ -534,31 +296,23 @@ function login() {
city: userdetails.address.city, city: userdetails.address.city,
postalcode: userdetails.address.zipcode, postalcode: userdetails.address.zipcode,
country: "DE", country: "DE",
}; }
} }
if (state.org_name !== "" && state.org_teams.length > 0) { if (state.org_name !== '' && state.org_teams.length > 0) {
postdata.team = org_team.value; postdata.team = org_team.value;
} }
toast("Registrierung läuft..."); toast("Registrierung läuft...");
const browserlocale = ( const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2);
(navigator.languages && navigator.languages[0]) ||
""
).substr(0, 2);
let url = `${config.baseurl}api/runners/register/?locale=${browserlocale}`; let url = `${config.baseurl}api/runners/register/?locale=${browserlocale}`;
if (props.token) { if (props.token) {
url = `${config.baseurl}api/runners/register/${props.token}/?locale=${browserlocale}`; url = `${config.baseurl}api/runners/register/${props.token}/?locale=${browserlocale}`
} }
registrationState.value = "loading"; axios.post(url, postdata)
axios
.post(url, postdata)
.then(() => { .then(() => {
registrationState.value = "registered"; location.replace(`${config.baseurl_selfservice}registered/?mail=${encodeURIComponent(postdata.email)}`);
}) })
.catch((error) => { .catch((error) => {
console.log(error); console.log(error);
if (error.data.message === "E-Mail already registered") {
toast("bereits registriert...", { type: TYPE.ERROR });
}
}); });
} }
} }