Client - init statistics store
This commit is contained in:
parent
6f6291fb2b
commit
0c516b9986
@ -3,6 +3,11 @@ import {
|
|||||||
RootGetters,
|
RootGetters,
|
||||||
RootMutations,
|
RootMutations,
|
||||||
} from '@/store/modules/root/enums'
|
} from '@/store/modules/root/enums'
|
||||||
|
import {
|
||||||
|
StatisticsActions,
|
||||||
|
StatisticsGetters,
|
||||||
|
StatisticsMutations,
|
||||||
|
} from '@/store/modules/statistics/enums'
|
||||||
import {
|
import {
|
||||||
UserActions,
|
UserActions,
|
||||||
UserGetters,
|
UserGetters,
|
||||||
@ -15,6 +20,12 @@ export const ROOT_STORE = {
|
|||||||
MUTATIONS: RootMutations,
|
MUTATIONS: RootMutations,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const STATS_STORE = {
|
||||||
|
ACTIONS: StatisticsActions,
|
||||||
|
GETTERS: StatisticsGetters,
|
||||||
|
MUTATIONS: StatisticsMutations,
|
||||||
|
}
|
||||||
|
|
||||||
export const USER_STORE = {
|
export const USER_STORE = {
|
||||||
ACTIONS: UserActions,
|
ACTIONS: UserActions,
|
||||||
GETTERS: UserGetters,
|
GETTERS: UserGetters,
|
||||||
|
@ -5,9 +5,11 @@ import { getters } from '@/store/modules/root/getters'
|
|||||||
import { IRootState } from '@/store/modules/root/interfaces'
|
import { IRootState } from '@/store/modules/root/interfaces'
|
||||||
import { mutations } from '@/store/modules/root/mutations'
|
import { mutations } from '@/store/modules/root/mutations'
|
||||||
import { state } from '@/store/modules/root/state.ts'
|
import { state } from '@/store/modules/root/state.ts'
|
||||||
|
import statsModule from '@/store/modules/statistics'
|
||||||
import userModule from '@/store/modules/user'
|
import userModule from '@/store/modules/user'
|
||||||
|
|
||||||
const modules: ModuleTree<IRootState> = {
|
const modules: ModuleTree<IRootState> = {
|
||||||
|
statsModule,
|
||||||
userModule,
|
userModule,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
36
fittrackee_client/src/store/modules/statistics/actions.ts
Normal file
36
fittrackee_client/src/store/modules/statistics/actions.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import { ActionContext, ActionTree } from 'vuex'
|
||||||
|
|
||||||
|
import authApi from '@/api/authApi'
|
||||||
|
import { STATS_STORE, ROOT_STORE } from '@/store/constants'
|
||||||
|
import { IRootState } from '@/store/modules/root/interfaces'
|
||||||
|
import {
|
||||||
|
IStatisticsActions,
|
||||||
|
IStatisticsState,
|
||||||
|
} from '@/store/modules/statistics/interfaces'
|
||||||
|
import { IUserStatisticsPayload } from '@/types/statistics'
|
||||||
|
import { handleError } from '@/utils'
|
||||||
|
|
||||||
|
export const actions: ActionTree<IStatisticsState, IRootState> &
|
||||||
|
IStatisticsActions = {
|
||||||
|
[STATS_STORE.ACTIONS.GET_USER_STATS](
|
||||||
|
context: ActionContext<IStatisticsState, IRootState>,
|
||||||
|
payload: IUserStatisticsPayload
|
||||||
|
): void {
|
||||||
|
context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES)
|
||||||
|
authApi
|
||||||
|
.get(`stats/${payload.username}/${payload.filterType}`, {
|
||||||
|
params: payload.params,
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
if (res.data.status === 'success') {
|
||||||
|
context.commit(
|
||||||
|
STATS_STORE.MUTATIONS.UPDATE_USER_STATS,
|
||||||
|
res.data.data.statistics
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
handleError(context, null)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((error) => handleError(context, error))
|
||||||
|
},
|
||||||
|
}
|
11
fittrackee_client/src/store/modules/statistics/enums.ts
Normal file
11
fittrackee_client/src/store/modules/statistics/enums.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
export enum StatisticsActions {
|
||||||
|
GET_USER_STATS = 'GET_USER_STATS',
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum StatisticsGetters {
|
||||||
|
USER_STATS = 'USER_STATS',
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum StatisticsMutations {
|
||||||
|
UPDATE_USER_STATS = 'UPDATE_USER_STATS',
|
||||||
|
}
|
15
fittrackee_client/src/store/modules/statistics/getters.ts
Normal file
15
fittrackee_client/src/store/modules/statistics/getters.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { GetterTree } from 'vuex'
|
||||||
|
|
||||||
|
import { STATS_STORE } from '@/store/constants'
|
||||||
|
import { IRootState } from '@/store/modules/root/interfaces'
|
||||||
|
import {
|
||||||
|
IStatisticsGetters,
|
||||||
|
IStatisticsState,
|
||||||
|
} from '@/store/modules/statistics/interfaces'
|
||||||
|
|
||||||
|
export const getters: GetterTree<IStatisticsState, IRootState> &
|
||||||
|
IStatisticsGetters = {
|
||||||
|
[STATS_STORE.GETTERS.USER_STATS]: (state: IStatisticsState) => {
|
||||||
|
return state.statistics
|
||||||
|
},
|
||||||
|
}
|
17
fittrackee_client/src/store/modules/statistics/index.ts
Normal file
17
fittrackee_client/src/store/modules/statistics/index.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { Module } from 'vuex'
|
||||||
|
|
||||||
|
import { IRootState } from '@/store/modules/root/interfaces'
|
||||||
|
import { actions } from '@/store/modules/statistics/actions'
|
||||||
|
import { getters } from '@/store/modules/statistics/getters'
|
||||||
|
import { IStatisticsState } from '@/store/modules/statistics/interfaces'
|
||||||
|
import { mutations } from '@/store/modules/statistics/mutations'
|
||||||
|
import { statisticsState } from '@/store/modules/statistics/state'
|
||||||
|
|
||||||
|
const statistics: Module<IStatisticsState, IRootState> = {
|
||||||
|
state: statisticsState,
|
||||||
|
actions,
|
||||||
|
getters,
|
||||||
|
mutations,
|
||||||
|
}
|
||||||
|
|
||||||
|
export default statistics
|
20
fittrackee_client/src/store/modules/statistics/interfaces.ts
Normal file
20
fittrackee_client/src/store/modules/statistics/interfaces.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { ActionContext } from 'vuex'
|
||||||
|
|
||||||
|
import { STATS_STORE } from '@/store/constants'
|
||||||
|
import { IRootState } from '@/store/modules/root/interfaces'
|
||||||
|
import { IUserStatisticsPayload, TStatistics } from '@/types/statistics'
|
||||||
|
|
||||||
|
export interface IStatisticsState {
|
||||||
|
statistics: TStatistics
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IStatisticsActions {
|
||||||
|
[STATS_STORE.ACTIONS.GET_USER_STATS](
|
||||||
|
context: ActionContext<IStatisticsState, IRootState>,
|
||||||
|
payload: IUserStatisticsPayload
|
||||||
|
): void
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IStatisticsGetters {
|
||||||
|
[STATS_STORE.GETTERS.USER_STATS](state: IStatisticsState): TStatistics
|
||||||
|
}
|
16
fittrackee_client/src/store/modules/statistics/mutations.ts
Normal file
16
fittrackee_client/src/store/modules/statistics/mutations.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { MutationTree } from 'vuex'
|
||||||
|
|
||||||
|
import { STATS_STORE } from '@/store/constants'
|
||||||
|
import { IStatisticsState } from '@/store/modules/statistics/interfaces'
|
||||||
|
import { TStatisticsMutations } from '@/store/modules/statistics/types'
|
||||||
|
import { TStatistics } from '@/types/statistics'
|
||||||
|
|
||||||
|
export const mutations: MutationTree<IStatisticsState> & TStatisticsMutations =
|
||||||
|
{
|
||||||
|
[STATS_STORE.MUTATIONS.UPDATE_USER_STATS](
|
||||||
|
state: IStatisticsState,
|
||||||
|
statistics: TStatistics
|
||||||
|
) {
|
||||||
|
state.statistics = statistics
|
||||||
|
},
|
||||||
|
}
|
6
fittrackee_client/src/store/modules/statistics/state.ts
Normal file
6
fittrackee_client/src/store/modules/statistics/state.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import { IStatisticsState } from '@/store/modules/statistics/interfaces'
|
||||||
|
import { TStatistics } from '@/types/statistics'
|
||||||
|
|
||||||
|
export const statisticsState: IStatisticsState = {
|
||||||
|
statistics: <TStatistics>{},
|
||||||
|
}
|
40
fittrackee_client/src/store/modules/statistics/types.ts
Normal file
40
fittrackee_client/src/store/modules/statistics/types.ts
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import { Store as VuexStore, CommitOptions, DispatchOptions } from 'vuex'
|
||||||
|
|
||||||
|
import { STATS_STORE } from '@/store/constants'
|
||||||
|
import {
|
||||||
|
IStatisticsState,
|
||||||
|
IStatisticsActions,
|
||||||
|
IStatisticsGetters,
|
||||||
|
} from '@/store/modules/statistics/interfaces'
|
||||||
|
import { TStatistics } from '@/types/statistics'
|
||||||
|
|
||||||
|
export type TStatisticsMutations<S = IStatisticsState> = {
|
||||||
|
[STATS_STORE.MUTATIONS.UPDATE_USER_STATS](
|
||||||
|
state: S,
|
||||||
|
statistics: TStatistics
|
||||||
|
): void
|
||||||
|
}
|
||||||
|
|
||||||
|
export type TStatisticsStoreModule<S = IStatisticsState> = Omit<
|
||||||
|
VuexStore<S>,
|
||||||
|
'commit' | 'getters' | 'dispatch'
|
||||||
|
> & {
|
||||||
|
dispatch<K extends keyof IStatisticsActions>(
|
||||||
|
key: K,
|
||||||
|
payload?: Parameters<IStatisticsActions[K]>[1],
|
||||||
|
options?: DispatchOptions
|
||||||
|
): ReturnType<IStatisticsActions[K]>
|
||||||
|
} & {
|
||||||
|
getters: {
|
||||||
|
[K in keyof IStatisticsGetters]: ReturnType<IStatisticsGetters[K]>
|
||||||
|
}
|
||||||
|
} & {
|
||||||
|
commit<
|
||||||
|
K extends keyof TStatisticsMutations,
|
||||||
|
P extends Parameters<TStatisticsMutations[K]>[1]
|
||||||
|
>(
|
||||||
|
key: K,
|
||||||
|
payload?: P,
|
||||||
|
options?: CommitOptions
|
||||||
|
): ReturnType<TStatisticsMutations[K]>
|
||||||
|
}
|
@ -4,7 +4,6 @@ import { USER_STORE } from '@/store/constants'
|
|||||||
import { IRootState } from '@/store/modules/root/interfaces'
|
import { IRootState } from '@/store/modules/root/interfaces'
|
||||||
import { IAuthUserProfile, ILoginOrRegisterData } from '@/types/user'
|
import { IAuthUserProfile, ILoginOrRegisterData } from '@/types/user'
|
||||||
|
|
||||||
// STORE
|
|
||||||
export interface IUserState {
|
export interface IUserState {
|
||||||
authToken: string | null
|
authToken: string | null
|
||||||
authUserProfile: IAuthUserProfile
|
authUserProfile: IAuthUserProfile
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
import { TRootStoreModule } from '@/store/modules/root/types'
|
import { TRootStoreModule } from '@/store/modules/root/types'
|
||||||
|
import { TStatisticsStoreModule } from '@/store/modules/statistics/types'
|
||||||
import { TUserStoreModule } from '@/store/modules/user/types'
|
import { TUserStoreModule } from '@/store/modules/user/types'
|
||||||
|
|
||||||
type StoreModules = {
|
type StoreModules = {
|
||||||
rootModule: TRootStoreModule
|
rootModule: TRootStoreModule
|
||||||
|
statsModule: TStatisticsStoreModule
|
||||||
userModule: TUserStoreModule
|
userModule: TUserStoreModule
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Store = TUserStoreModule<Pick<StoreModules, 'userModule'>> &
|
export type Store = TUserStoreModule<Pick<StoreModules, 'userModule'>> &
|
||||||
|
TStatisticsStoreModule<Pick<StoreModules, 'statsModule'>> &
|
||||||
TRootStoreModule<Pick<StoreModules, 'rootModule'>>
|
TRootStoreModule<Pick<StoreModules, 'rootModule'>>
|
||||||
|
20
fittrackee_client/src/types/statistics.ts
Normal file
20
fittrackee_client/src/types/statistics.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
export interface IStatistics {
|
||||||
|
nb_workouts: number
|
||||||
|
total_distance: number
|
||||||
|
total_duration: number
|
||||||
|
}
|
||||||
|
export type TStatistics = {
|
||||||
|
[key in string | number]: IStatistics
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IStatisticsParams {
|
||||||
|
from: string
|
||||||
|
to: string
|
||||||
|
time: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IUserStatisticsPayload {
|
||||||
|
username: string
|
||||||
|
filterType: string
|
||||||
|
params: IStatisticsParams
|
||||||
|
}
|
@ -3,6 +3,7 @@ import { ActionContext } from 'vuex'
|
|||||||
|
|
||||||
import { ROOT_STORE } from '@/store/constants'
|
import { ROOT_STORE } from '@/store/constants'
|
||||||
import { IRootState } from '@/store/modules/root/interfaces'
|
import { IRootState } from '@/store/modules/root/interfaces'
|
||||||
|
import { IStatisticsState } from '@/store/modules/statistics/interfaces'
|
||||||
import { IUserState } from '@/store/modules/user/interfaces'
|
import { IUserState } from '@/store/modules/user/interfaces'
|
||||||
|
|
||||||
export const getApiUrl = (): string => {
|
export const getApiUrl = (): string => {
|
||||||
@ -17,7 +18,8 @@ const removeLastDot = (text: string): string => text.replace(/\.$/gm, '')
|
|||||||
export const handleError = (
|
export const handleError = (
|
||||||
context:
|
context:
|
||||||
| ActionContext<IRootState, IRootState>
|
| ActionContext<IRootState, IRootState>
|
||||||
| ActionContext<IUserState, IRootState>,
|
| ActionContext<IUserState, IRootState>
|
||||||
|
| ActionContext<IStatisticsState, IRootState>,
|
||||||
error: AxiosError | null,
|
error: AxiosError | null,
|
||||||
msg = 'UNKNOWN'
|
msg = 'UNKNOWN'
|
||||||
): void => {
|
): void => {
|
||||||
|
Loading…
Reference in New Issue
Block a user