sajjad_talkhabi 3 years ago
parent a842fa3ad7
commit af97b05281

5
package-lock.json generated

@ -6824,6 +6824,11 @@
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true
},
"izitoast": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/izitoast/-/izitoast-1.4.0.tgz",
"integrity": "sha512-Oc1X2wiQtPp39i5VpIjf3GJf5sfCtHKXZ5szx7RareyEeFLUlcEW0FSfBni28+Ul6KNKZRKzhVuWzSP4Xngh0w=="
},
"javascript-stringify": {
"version": "2.1.0",
"resolved": "https://registry.nlark.com/javascript-stringify/download/javascript-stringify-2.1.0.tgz",

@ -11,6 +11,7 @@
"axios": "^0.21.4",
"bootstrap": "^4.6.0",
"core-js": "^3.6.5",
"izitoast": "^1.4.0",
"jquery": "^3.6.0",
"meta-router": "^4.0.1",
"popper.js": "^1.16.1",

@ -0,0 +1,15 @@
import axios from "axios";
import url from "@/router/url";
import {
getArray,
} from "../resources/programResource";
export default class ProgramRepository {
async index() {
let response = await axios.get(url("indexProgram"), {
headers: { 'accept-language': 'en' },
});
if (response.status === 200) {
return getArray(response.data);
}
}
}

@ -0,0 +1,22 @@
import { SetPagination } from "@/utils/setQueriesObject";
import { getJsonTrainer } from './trainerProgramResource';
import { getJsonSportCategory } from './sportCategoryPorgramResource';
export const getJson = (data) => ({
id: data.id,
trainer: data.trainer ? getJsonTrainer(data.trainer) : {},
sport_category: data.trainer ? getJsonSportCategory(data.trainer) : {},
sport_category_id: data.sport_category_id,
status: data.status,
title: data.title,
description: data.description,
created_at: data.created_at,
updated_at: data.updated_at,
series_count: data.series_count
});
export const getArray = ({ data, meta }) => {
const pagination = SetPagination(meta);
data = data.map((program) => getJson(program));
return { data, pagination };
};

@ -0,0 +1,6 @@
export const getJsonSportCategory = (data) => ({
id: data.sport_category.id,
name: data.sport_category.name,
local_name: data.sport_category.local_name,
language_id: data.sport_category.language_id,
})

@ -0,0 +1,11 @@
export const getJsonTrainer = (data) => ({
id: data.trainer.id,
first_name: data.trainer.first_name,
last_name: data.trainer.last_name,
birthday: data.trainer.birthday,
weight: data.trainer.weight,
height: data.trainer.height,
arm_diameter: data.trainer.arm_diameter,
leg_diameter: data.trainer.leg_diameter,
details: data.trainer.details
})

@ -31,7 +31,14 @@
</div>
</div>
<v-row class="mt-4">
<v-col cols="12" sm="4" v-for="program in programs" :key="program.id" class="mb-3"><ProgramItem :program="program" /></v-col>
<v-col
cols="12"
sm="4"
v-for="program in programs"
:key="program.id"
class="mb-3"
><ProgramItem :program="program"
/></v-col>
</v-row>
</div>
</main-back>
@ -44,11 +51,22 @@ import ThirdImage from "../../assets/5595849.jpg";
import FourthImage from "../../assets/28-284379_photo-wallpaper-man-workout-gym-working-gym-workout.jpg";
import SectionTitle from "../Global/Section/SectionTitle.vue";
import ProgramItem from "./Item.vue";
import { mapGetters, mapActions } from "vuex";
export default {
components: {
SectionTitle,
ProgramItem,
},
computed: {
...mapGetters("programs", ["getPrograms"]),
},
methods: {
...mapActions("programs", ["loadPrograms"]),
},
created() {
this.loadPrograms();
console.log("getPrograms", this.getPrograms);
},
data: () => ({
programs: [
{

@ -7,7 +7,7 @@ import './utils/GlobalComponents';
import "./styles/global.scss";
import './mixins/Global.js';
import ApiService from '@/utils/axios/api';
ApiService.init('https://www.champya-dev.ir');
ApiService.init('https://app.champya-dev.ir');
import '@/utils/axios/errorHandler';
Vue.config.productionTip = false

@ -1,7 +1,11 @@
import { urlGenerator } from "@/utils/urlGenerator";
const urls = {
login: "auth/login"
login: "auth/login",
register: "auth/register",
resetPassword: "auth/forget-password",
logout: "auth/logout",
indexProgram: 'courses'
};
export default urlGenerator(urls);

@ -1,5 +1,5 @@
import AuthRepository from "../../../abstraction/repository/authRepository";
import {TokenStorage, UserStorage} from "@/utils/storage";
import { TokenStorage, UserStorage } from "@/utils/storage";
import ApiService from "@/utils/axios/api";
function setTokenHeader(commit, response) {
@ -10,7 +10,8 @@ function setTokenHeader(commit, response) {
}
export default {
async login({commit}, data) {
async login({ commit }, data) {
console.log(data);
let repository = new AuthRepository();
const response = await repository.login(data);
if (response) {
@ -25,7 +26,7 @@ export default {
TokenStorage.removeToken();
return true;
},
async register({commit}, data) {
async register({ commit }, data) {
let repository = new AuthRepository();
const response = await repository.register(data);
setTokenHeader(commit, response);

@ -0,0 +1,15 @@
import ProgramRepository from "@/abstraction/repository/programRepository";
export default {
async loadPrograms({ state, commit }) {
try {
let data = { pagination: state.pagination };
let repository = new ProgramRepository();
const resource = await repository.index(data);
console.log(resource.data);
commit("SET_PROGRAMS", resource.data);
commit("SET_PAGINATION", resource.pagination);
} catch (e) {
return e;
}
},
};

@ -0,0 +1,3 @@
export default {
getPrograms: state => state.programs,
};

@ -0,0 +1,11 @@
import Vue from "vue";
export default {
SET_PROGRAMS(state, data) {
Vue.set(state, "programs", data);
},
SET_PAGINATION(state, pagination) {
pagination = { ...state.pagination, ...pagination };
Vue.set(state, "pagination", pagination);
},
};

@ -0,0 +1,6 @@
export default {
programs: [],
pagination: {
itemsPerPage: 12
},
};

@ -1,6 +1,6 @@
import axios from "axios";
import store from "@/store";
// import toast from "../toast";
import toast from "../toast";
import Vue from "vue";
import { TokenStorage } from "../storage";
import ApiService from "./api";
@ -20,17 +20,17 @@ function errorResponseHandler(error) {
ApiService.removeAuthHeader();
store.commit('auth/logout', {}, { root: true });
window.location.href = '/';
// toast.error('Wrong username or password.', 'Error');
toast.error('Wrong username or password.', 'Error');
} else if (error.response.status === 422) {
if (typeof error.response.data.errors !== 'undefined') {
for (const key in error.response.data.errors) {
if (Object.prototype.hasOwnProperty.call(error.response.data.errors, key)) {
// toast.error(error.response.data.errors[key], 'Error');
toast.error(error.response.data.errors[key], 'Error');
}
}
}
} else if (error.response.status === 500) {
// toast.error('Server Error', 'Error');
toast.error('Server Error', 'Error');
}
}
return Promise.reject(error);
@ -38,7 +38,7 @@ function errorResponseHandler(error) {
function successHandler(response) {
if (response.status === 200 || response.status === 201) {
if (typeof response.data.message !== 'undefined' && typeof response.data.message.content !== 'undefined') {
// toast.success(response.data.message.content, response.data.message.title || 'Success');
toast.success(response.data.message.content, response.data.message.title || 'Success');
}
}
return response;

@ -37,6 +37,7 @@ const UserStorage = {
save(user = null) {
user = qs.stringify(user);
localStorage.setItem(USER, user);
console.log('user saved');
},
remove() {

@ -0,0 +1,23 @@
import "izitoast/dist/css/iziToast.min.css";
import iZtoast from "izitoast";
const toast = {
error: (message, title = "Error") => {
return iZtoast.error({
title: title,
message: message,
rtl: true,
position: "bottomCenter"
});
},
success: (message, title = "Success") => {
return iZtoast.success({
title: title,
message: message,
rtl: true,
position: "bottomCenter"
});
}
};
export default toast;

@ -1,5 +1,5 @@
const urlGenerator = (urls) => {
return function(routeAddress, parameters) {
return function (routeAddress, parameters) {
let urlPath = urls[routeAddress].split("/");
let newPath = [];
for (const iterator of urlPath) {
@ -15,7 +15,7 @@ const urlGenerator = (urls) => {
newPath.push(iterator);
}
}
return '/api/' + newPath.join("/");
return '/api/v1/' + newPath.join("/");
}
};

@ -45,10 +45,10 @@
<router-link :to="{ name: 'login' }">
<RectangleButton
class="custom-btn w-100"
height="25"
height="25"
:text-mode="true"
text="sign in"
@click.native="login"
@click.native="doLogin"
/></router-link>
</div>
</v-col>
@ -105,10 +105,11 @@ export default {
methods: {
...mapActions("auth", ["login"]),
async doLogin() {
const response = await this.login(this.form);
if (response) {
this.$router.push(this.$route.query.redirect || "/");
}
console.log(this.form);
this.login(this.form);
// if (response) {
// this.$router.push(this.$route.query.redirect || "/");
// }
},
},
};

@ -22,6 +22,8 @@
placeholder="your email address"
label="your email address"
class="no-error-msg"
dark
v-model="form.email"
></v-text-field>
</v-col>
</v-row>
@ -33,6 +35,7 @@
height="25"
:text-mode="true"
text="send the code"
@click.native="resetPassword"
/>
</v-col>
<v-col cols="12" class="pt-0">
@ -62,9 +65,19 @@
</template>
<script>
import AuthBasic from "../components/Global/Section/AuthBasic.vue";
import AuthRepository from "../abstraction/repository/authRepository";
export default {
components: {
AuthBasic,
},
data: () => ({
form: {},
}),
methods: {
async resetPassword() {
let repository = new AuthRepository();
await repository.resetPassword(this.form);
},
},
};
</script>

@ -20,17 +20,28 @@
placeholder="your email address"
label="your email address"
class="no-error-msg"
dark
v-model="form.email"
></v-text-field>
</v-col>
</v-row>
<v-row>
<v-col class="pt-0" cols="12">
<v-col class="pt-0" cols="6">
<v-text-field
placeholder="your first name"
label="your first name"
class="no-error-msg"
dark
v-model="form.first_name"
></v-text-field>
</v-col>
<v-col class="pt-0" cols="6">
<v-text-field
placeholder="your full name"
label="your full name"
placeholder="your last name"
label="your last name"
class="no-error-msg"
dark
v-model="form.last_name"
></v-text-field>
</v-col>
</v-row>
@ -40,7 +51,8 @@
placeholder="password"
label="password"
class="no-error-msg"
dark
v-model="form.password"
></v-text-field>
</v-col>
</v-row>
@ -50,7 +62,8 @@
placeholder="your password again"
label="your password again"
class="no-error-msg"
dark
v-model="form.password_confirmation"
></v-text-field>
</v-col>
</v-row>
@ -63,6 +76,7 @@
height="25"
:text-mode="true"
text="do sign up"
@click.native="register(form)"
/></router-link>
</div>
</v-col>
@ -107,9 +121,16 @@
</template>
<script>
import AuthBasic from "../components/Global/Section/AuthBasic.vue";
import { mapActions } from "vuex";
export default {
components: {
AuthBasic,
},
data: () => ({
form: {},
}),
methods: {
...mapActions("auth", ["register"]),
},
};
</script>
Loading…
Cancel
Save