Client - rename existing front

This commit is contained in:
Sam
2021-09-01 20:08:06 +02:00
parent 6ba3f6d54e
commit 6d1de3c3bb
134 changed files with 0 additions and 0 deletions

View File

@ -0,0 +1,47 @@
import FitTrackeeGenericApi from '../fitTrackeeApi'
import { history } from '../index'
import { generateIds } from '../utils'
import { emptyMessages, setError } from './index'
export const setAppConfig = data => ({
type: 'SET_APP_CONFIG',
data,
})
export const setAppStats = data => ({
type: 'SET_APP_STATS',
data,
})
const SetAppErrors = messages => ({ type: 'APP_ERRORS', messages })
export const getAppData = target => dispatch =>
FitTrackeeGenericApi.getData(target)
.then(ret => {
if (ret.status === 'success') {
if (target === 'config') {
dispatch(setAppConfig(ret.data))
} else if (target === 'stats/all') {
dispatch(setAppStats(ret.data))
}
} else {
dispatch(setError(`application|${ret.message}`))
}
})
.catch(error => dispatch(setError(`application|${error}`)))
export const updateAppConfig = formData => dispatch => {
dispatch(emptyMessages())
FitTrackeeGenericApi.updateData('config', formData)
.then(ret => {
if (ret.status === 'success') {
dispatch(setAppConfig(ret.data))
history.push('/admin/application')
} else if (Array.isArray(ret.message)) {
dispatch(SetAppErrors(generateIds(ret.message)))
} else {
dispatch(setError(ret.message))
}
})
.catch(error => dispatch(setError(`application|${error}`)))
}

View File

@ -0,0 +1,111 @@
import i18next from 'i18next'
import FitTrackeeApi from '../fitTrackeeApi/index'
import { history } from '../index'
export const emptyMessages = () => ({
type: 'CLEAN_ALL_MESSAGES',
})
export const setData = (target, data) => ({
type: 'SET_DATA',
data,
target,
})
export const setPaginatedData = (target, data, pagination) => ({
type: 'SET_PAGINATED_DATA',
data,
pagination,
target,
})
export const setError = message => ({
type: 'SET_ERROR',
message,
})
export const setLanguage = language => ({
type: 'SET_LANGUAGE',
language,
})
export const setLoading = loading => ({
type: 'SET_LOADING',
loading,
})
export const updateSportsData = data => ({
type: 'UPDATE_SPORT_DATA',
data,
})
export const updateUsersData = data => ({
type: 'UPDATE_USER_DATA',
data,
})
export const getOrUpdateData =
(action, target, data, canDispatch = true) =>
dispatch => {
dispatch(setLoading(true))
if (data && data.id && target !== 'workouts' && isNaN(data.id)) {
dispatch(setLoading(false))
return dispatch(setError(`${target}|Incorrect id`))
}
dispatch(emptyMessages())
return FitTrackeeApi[action](target, data)
.then(ret => {
if (ret.status === 'success') {
if (canDispatch) {
if (target === 'users' && action === 'getData') {
return dispatch(
setPaginatedData(target, ret.data, ret.pagination)
)
}
dispatch(setData(target, ret.data))
} else if (action === 'updateData' && target === 'sports') {
dispatch(updateSportsData(ret.data.sports[0]))
} else if (action === 'updateData' && target === 'users') {
dispatch(updateUsersData(ret.data.users[0]))
}
} else {
dispatch(setError(`${target}|${ret.message || ret.status}`))
}
dispatch(setLoading(false))
})
.catch(error => {
dispatch(setLoading(false))
dispatch(setError(`${target}|${error}`))
})
}
export const addData = (target, data) => dispatch =>
FitTrackeeApi.addData(target, data)
.then(ret => {
if (ret.status === 'created') {
history.push(`/admin/${target}`)
} else {
dispatch(setError(`${target}|${ret.status}`))
}
})
.catch(error => dispatch(setError(`${target}|${error}`)))
export const deleteData = (target, id) => dispatch => {
if (isNaN(id)) {
return dispatch(setError(target, `${target}|Incorrect id`))
}
return FitTrackeeApi.deleteData(target, id)
.then(ret => {
if (ret.status === 204) {
history.push(`/admin/${target}`)
} else {
dispatch(setError(`${target}|${ret.message || ret.status}`))
}
})
.catch(error => dispatch(setError(`${target}|${error}`)))
}
export const updateLanguage = language => dispatch => {
i18next.changeLanguage(language).then(dispatch(setLanguage(language)))
}

View File

@ -0,0 +1,13 @@
import FitTrackeeGenericApi from '../fitTrackeeApi'
import { setData, setError } from './index'
export const getStats = (userName, type, data) => dispatch =>
FitTrackeeGenericApi.getData(`stats/${userName}/${type}`, data)
.then(ret => {
if (ret.status === 'success') {
dispatch(setData('statistics', ret.data))
} else {
dispatch(setError(`statistics|${ret.message}`))
}
})
.catch(error => dispatch(setError(`statistics|${error}`)))

View File

@ -0,0 +1,174 @@
import FitTrackeeGenericApi from '../fitTrackeeApi'
import FitTrackeeApi from '../fitTrackeeApi/auth'
import { history } from '../index'
import { generateIds } from '../utils'
import { getOrUpdateData, setError, updateLanguage } from './index'
import { getAppData } from './application'
const AuthError = message => ({ type: 'AUTH_ERROR', message })
const AuthErrors = messages => ({ type: 'AUTH_ERRORS', messages })
const PictureError = message => ({ type: 'PICTURE_ERROR', message })
const ProfileSuccess = profil => ({ type: 'PROFILE_SUCCESS', profil })
const ProfileError = message => ({ type: 'PROFILE_ERROR', message })
const ProfileUpdateError = message => ({
type: 'PROFILE_UPDATE_ERROR',
message,
})
export const logout = () => ({ type: 'LOGOUT' })
export const loadProfile = () => dispatch => {
if (window.localStorage.getItem('authToken')) {
return dispatch(getProfile())
}
return { type: 'LOGOUT' }
}
export const getProfile = () => dispatch =>
FitTrackeeGenericApi.getData('auth/profile')
.then(ret => {
if (ret.status === 'success') {
dispatch(getOrUpdateData('getData', 'sports'))
ret.data.isAuthenticated = true
if (ret.data.language) {
dispatch(updateLanguage(ret.data.language))
}
return dispatch(ProfileSuccess(ret.data))
}
return dispatch(ProfileError(ret.message))
})
.catch(error => {
throw error
})
export const loginOrRegisterOrPasswordReset = (target, formData) => dispatch =>
FitTrackeeApi.loginOrRegisterOrPasswordReset(target, formData)
.then(ret => {
if (ret.status === 'success') {
if (target === 'password/reset-request') {
return history.push({
pathname: '/password-reset/sent',
})
}
if (target === 'password/update') {
return history.push({
pathname: '/updated-password',
})
}
if (target === 'login' || target === 'register') {
window.localStorage.setItem('authToken', ret.auth_token)
if (target === 'register') {
dispatch(getAppData('config'))
}
return dispatch(getProfile())
}
}
return dispatch(AuthError(ret.message))
})
.catch(error => {
throw error
})
const RegisterFormControl = (formData, onlyPasswords = false) => {
const errMsg = []
if (
!onlyPasswords &&
(formData.username.length < 3 || formData.username.length > 12)
) {
errMsg.push('3 to 12 characters required for username.')
}
if (formData.password !== formData.password_conf) {
errMsg.push("Password and password confirmation don't match.")
}
if (formData.password.length < 8) {
errMsg.push('8 characters required for password.')
}
return errMsg
}
export const handleUserFormSubmit = (formData, formType) => dispatch => {
if (formType === 'register' || formType === 'password/update') {
const ret = RegisterFormControl(formData, formType === 'password/update')
if (ret.length > 0) {
return dispatch(AuthErrors(generateIds(ret)))
}
}
return dispatch(loginOrRegisterOrPasswordReset(formType, formData))
}
export const handleProfileFormSubmit = formData => dispatch => {
if (!formData.password === formData.password_conf) {
return dispatch(
ProfileUpdateError("Password and password confirmation don't match.")
)
}
delete formData.id
return FitTrackeeGenericApi.postData('auth/profile/edit', formData)
.then(ret => {
if (ret.status === 'success') {
dispatch(getProfile())
return history.push('/profile')
}
dispatch(ProfileUpdateError(ret.message))
})
.catch(error => {
throw error
})
}
export const uploadPicture = event => dispatch => {
event.preventDefault()
const form = new FormData()
form.append('file', event.target.picture.files[0])
event.target.reset()
return FitTrackeeGenericApi.addDataWithFile('auth/picture', form)
.then(ret => {
if (ret.status === 'success') {
return dispatch(getProfile())
}
const msg =
ret.status === 413
? 'Error during picture update, file size exceeds max size.'
: ret.message
return dispatch(PictureError(msg))
})
.catch(error => {
throw error
})
}
export const deletePicture = () => dispatch =>
FitTrackeeApi.deletePicture()
.then(ret => {
if (ret.status === 204) {
return dispatch(getProfile())
}
return dispatch(PictureError(ret.message))
})
.catch(error => {
throw error
})
export const deleteUser =
(username, isAdmin = false) =>
dispatch =>
FitTrackeeGenericApi.deleteData('users', username)
.then(ret => {
if (ret.status === 204) {
dispatch(getAppData('config'))
if (isAdmin) {
history.push('/admin/users')
} else {
dispatch(logout())
history.push('/')
}
} else {
ret.json().then(r => dispatch(setError(`${r.message}`)))
}
})
.catch(error => dispatch(setError(`user|${error}`)))

View File

@ -0,0 +1,192 @@
import FitTrackeeGenericApi from '../fitTrackeeApi'
import { history } from '../index'
import { formatChartData } from '../utils/workouts'
import { setError, setLoading } from './index'
import { loadProfile } from './user'
export const pushWorkouts = workouts => ({
type: 'PUSH_WORKOUTS',
workouts,
})
export const removeWorkout = workoutId => ({
type: 'REMOVE_WORKOUT',
workoutId,
})
export const updateCalendar = workouts => ({
type: 'UPDATE_CALENDAR',
workouts,
})
export const setGpx = gpxContent => ({
type: 'SET_GPX',
gpxContent,
})
export const setChartData = chartData => ({
type: 'SET_CHART_DATA',
chartData,
})
export const addWorkout = form => dispatch =>
FitTrackeeGenericApi.addDataWithFile('workouts', form)
.then(ret => {
if (ret.status === 'created') {
if (ret.data.workouts.length === 0) {
dispatch(setError('workouts|no correct file.'))
} else if (ret.data.workouts.length === 1) {
dispatch(loadProfile())
history.push(`/workouts/${ret.data.workouts[0].id}`)
} else {
// ret.data.workouts.length > 1
dispatch(loadProfile())
history.push('/')
}
} else if (ret.status === 413) {
dispatch(
setError('workouts|File size is greater than the allowed size')
)
} else {
dispatch(setError(`workouts|${ret.message}`))
}
dispatch(setLoading(false))
})
.catch(error => {
dispatch(setLoading(false))
dispatch(setError(`workouts|${error}`))
})
export const addWorkoutWithoutGpx = form => dispatch =>
FitTrackeeGenericApi.addData('workouts/no_gpx', form)
.then(ret => {
if (ret.status === 'created') {
dispatch(loadProfile())
history.push(`/workouts/${ret.data.workouts[0].id}`)
} else {
dispatch(setError(`workouts|${ret.message}`))
}
})
.catch(error => dispatch(setError(`workouts|${error}`)))
export const getWorkoutGpx = workoutId => dispatch => {
if (workoutId) {
return FitTrackeeGenericApi.getData(`workouts/${workoutId}/gpx`)
.then(ret => {
if (ret.status === 'success') {
dispatch(setGpx(ret.data.gpx))
} else {
dispatch(setError(`workouts|${ret.message}`))
}
})
.catch(error => dispatch(setError(`workouts|${error}`)))
}
dispatch(setGpx(null))
}
export const getSegmentGpx = (workoutId, segmentId) => dispatch => {
if (workoutId) {
return FitTrackeeGenericApi.getData(
`workouts/${workoutId}/gpx/segment/${segmentId}`
)
.then(ret => {
if (ret.status === 'success') {
dispatch(setGpx(ret.data.gpx))
} else {
dispatch(setError(`workouts|${ret.message}`))
}
})
.catch(error => dispatch(setError(`workouts|${error}`)))
}
dispatch(setGpx(null))
}
export const getWorkoutChartData = workoutId => dispatch => {
if (workoutId) {
return FitTrackeeGenericApi.getData(`workouts/${workoutId}/chart_data`)
.then(ret => {
if (ret.status === 'success') {
dispatch(setChartData(formatChartData(ret.data.chart_data)))
} else {
dispatch(setError(`workouts|${ret.message}`))
}
})
.catch(error => dispatch(setError(`workouts|${error}`)))
}
dispatch(setChartData(null))
}
export const getSegmentChartData = (workoutId, segmentId) => dispatch => {
if (workoutId) {
return FitTrackeeGenericApi.getData(
`workouts/${workoutId}/chart_data/segment/${segmentId}`
)
.then(ret => {
if (ret.status === 'success') {
dispatch(setChartData(formatChartData(ret.data.chart_data)))
} else {
dispatch(setError(`workouts|${ret.message}`))
}
})
.catch(error => dispatch(setError(`workouts|${error}`)))
}
dispatch(setChartData(null))
}
export const deleteWorkout = id => dispatch =>
FitTrackeeGenericApi.deleteData('workouts', id)
.then(ret => {
if (ret.status === 204) {
Promise.resolve(dispatch(removeWorkout(id)))
.then(() => dispatch(loadProfile()))
.then(() => history.push('/'))
} else {
dispatch(setError(`workouts|${ret.status}`))
}
})
.catch(error => dispatch(setError(`workouts|${error}`)))
export const editWorkout = form => dispatch =>
FitTrackeeGenericApi.updateData('workouts', form)
.then(ret => {
if (ret.status === 'success') {
dispatch(loadProfile())
history.push(`/workouts/${ret.data.workouts[0].id}`)
} else {
dispatch(setError(`workouts|${ret.message}`))
}
dispatch(setLoading(false))
})
.catch(error => {
dispatch(setLoading(false))
dispatch(setError(`workouts|${error}`))
})
export const getMoreWorkouts = params => dispatch =>
FitTrackeeGenericApi.getData('workouts', params)
.then(ret => {
if (ret.status === 'success') {
if (ret.data.workouts.length > 0) {
dispatch(pushWorkouts(ret.data.workouts))
}
} else {
dispatch(setError(`workouts|${ret.message}`))
}
})
.catch(error => dispatch(setError(`workouts|${error}`)))
export const getMonthWorkouts = (from, to) => dispatch =>
FitTrackeeGenericApi.getData('workouts', {
from,
to,
order: 'desc',
per_page: 100,
})
.then(ret => {
if (ret.status === 'success') {
dispatch(updateCalendar(ret.data.workouts))
} else {
dispatch(setError(`workouts|${ret.message}`))
}
})
.catch(error => dispatch(setError(`workouts|${error}`)))