mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-05-28 18:26:54 +00:00
feat: update endpoints (#45688)
This commit is contained in:
@@ -26,7 +26,16 @@ import {
|
||||
userTokenSelector
|
||||
} from '../redux';
|
||||
import { User } from '../redux/prop-types';
|
||||
import { submitNewAbout, updateUserFlag, verifyCert } from '../redux/settings';
|
||||
import {
|
||||
submitNewAbout,
|
||||
updateMyHonesty,
|
||||
updateMyPortfolio,
|
||||
updateMyQuincyEmail,
|
||||
updateMySound,
|
||||
updateMyTheme,
|
||||
updateUserFlag,
|
||||
verifyCert
|
||||
} from '../redux/settings';
|
||||
|
||||
const { apiLocation } = envData;
|
||||
|
||||
@@ -66,13 +75,13 @@ const mapDispatchToProps = {
|
||||
createFlashMessage,
|
||||
navigate,
|
||||
submitNewAbout,
|
||||
toggleNightMode: (theme: Themes) => updateUserFlag({ theme }),
|
||||
toggleSoundMode: (sound: boolean) => updateUserFlag({ sound }),
|
||||
toggleNightMode: (theme: Themes) => updateMyTheme({ theme }),
|
||||
toggleSoundMode: (sound: boolean) => updateMySound({ sound }),
|
||||
updateInternetSettings: updateUserFlag,
|
||||
updateIsHonest: updateUserFlag,
|
||||
updatePortfolio: updateUserFlag,
|
||||
updateIsHonest: updateMyHonesty,
|
||||
updatePortfolio: updateMyPortfolio,
|
||||
updateQuincyEmail: (sendQuincyEmail: boolean) =>
|
||||
updateUserFlag({ sendQuincyEmail }),
|
||||
updateMyQuincyEmail({ sendQuincyEmail }),
|
||||
verifyCert
|
||||
};
|
||||
|
||||
|
||||
@@ -19,7 +19,6 @@ import hardGoToEpic from './hard-go-to-epic';
|
||||
import { createReportUserSaga } from './report-user-saga';
|
||||
import { actionTypes as settingsTypes } from './settings/action-types';
|
||||
import { createShowCertSaga } from './show-cert-saga';
|
||||
import { createSoundModeSaga } from './sound-mode-saga';
|
||||
import updateCompleteEpic from './update-complete-epic';
|
||||
import { createUserTokenSaga } from './user-token-saga';
|
||||
import { createSaveChallengeSaga } from './save-challenge-saga';
|
||||
@@ -82,7 +81,6 @@ export const sagas = [
|
||||
...createFetchUserSaga(actionTypes),
|
||||
...createShowCertSaga(actionTypes),
|
||||
...createReportUserSaga(actionTypes),
|
||||
...createSoundModeSaga({ ...actionTypes, ...settingsTypes }),
|
||||
...createUserTokenSaga(actionTypes),
|
||||
...createSaveChallengeSaga(actionTypes)
|
||||
];
|
||||
@@ -746,6 +744,18 @@ export const reducer = handleActions(
|
||||
payload ? spreadThePayloadOnUser(state, payload) : state,
|
||||
[settingsTypes.updateMyEmailComplete]: (state, { payload }) =>
|
||||
payload ? spreadThePayloadOnUser(state, payload) : state,
|
||||
[settingsTypes.updateMySocialsComplete]: (state, { payload }) =>
|
||||
payload ? spreadThePayloadOnUser(state, payload) : state,
|
||||
[settingsTypes.updateMySoundComplete]: (state, { payload }) =>
|
||||
payload ? spreadThePayloadOnUser(state, payload) : state,
|
||||
[settingsTypes.updateMyThemeComplete]: (state, { payload }) =>
|
||||
payload ? spreadThePayloadOnUser(state, payload) : state,
|
||||
[settingsTypes.updateMyHonestyComplete]: (state, { payload }) =>
|
||||
payload ? spreadThePayloadOnUser(state, payload) : state,
|
||||
[settingsTypes.updateMyQuincyEmailComplete]: (state, { payload }) =>
|
||||
payload ? spreadThePayloadOnUser(state, payload) : state,
|
||||
[settingsTypes.updateMyPortfolioComplete]: (state, { payload }) =>
|
||||
payload ? spreadThePayloadOnUser(state, payload) : state,
|
||||
[settingsTypes.updateUserFlagComplete]: (state, { payload }) =>
|
||||
payload ? spreadThePayloadOnUser(state, payload) : state,
|
||||
[settingsTypes.verifyCertComplete]: (state, { payload }) =>
|
||||
|
||||
@@ -9,6 +9,12 @@ export const actionTypes = createTypes(
|
||||
...createAsyncTypes('submitNewUsername'),
|
||||
...createAsyncTypes('updateMyEmail'),
|
||||
...createAsyncTypes('updateUserFlag'),
|
||||
...createAsyncTypes('updateMySocials'),
|
||||
...createAsyncTypes('updateMySound'),
|
||||
...createAsyncTypes('updateMyTheme'),
|
||||
...createAsyncTypes('updateMyHonesty'),
|
||||
...createAsyncTypes('updateMyQuincyEmail'),
|
||||
...createAsyncTypes('updateMyPortfolio'),
|
||||
...createAsyncTypes('submitProfileUI'),
|
||||
...createAsyncTypes('verifyCert'),
|
||||
...createAsyncTypes('resetProgress'),
|
||||
|
||||
@@ -63,6 +63,52 @@ export const updateUserFlagComplete = createAction(
|
||||
);
|
||||
export const updateUserFlagError = createAction(types.updateUserFlagError);
|
||||
|
||||
export const updateMySocials = createAction(types.updateMySocials);
|
||||
export const updateMySocialsComplete = createAction(
|
||||
types.updateMySocialsComplete,
|
||||
checkForSuccessPayload
|
||||
);
|
||||
export const updateMySocialsError = createAction(types.updateMySocialsError);
|
||||
|
||||
export const updateMySound = createAction(types.updateMySound);
|
||||
export const updateMySoundComplete = createAction(
|
||||
types.updateMySoundComplete,
|
||||
checkForSuccessPayload
|
||||
);
|
||||
export const updateMySoundError = createAction(types.updateMySoundError);
|
||||
|
||||
export const updateMyTheme = createAction(types.updateMyTheme);
|
||||
export const updateMyThemeComplete = createAction(
|
||||
types.updateMyThemeComplete,
|
||||
checkForSuccessPayload
|
||||
);
|
||||
export const updateMyThemeError = createAction(types.updateMyThemeError);
|
||||
|
||||
export const updateMyHonesty = createAction(types.updateMyHonesty);
|
||||
export const updateMyHonestyComplete = createAction(
|
||||
types.updateMyHonestyComplete,
|
||||
checkForSuccessPayload
|
||||
);
|
||||
export const updateMyHonestyError = createAction(types.updateMyHonestyError);
|
||||
|
||||
export const updateMyQuincyEmail = createAction(types.updateMyQuincyEmail);
|
||||
export const updateMyQuincyEmailComplete = createAction(
|
||||
types.updateMyQuincyEmailComplete,
|
||||
checkForSuccessPayload
|
||||
);
|
||||
export const updateMyQuincyEmailError = createAction(
|
||||
types.updateMyQuincyEmailError
|
||||
);
|
||||
|
||||
export const updateMyPortfolio = createAction(types.updateMyPortfolio);
|
||||
export const updateMyPortfolioComplete = createAction(
|
||||
types.updateMyPortfolioComplete,
|
||||
checkForSuccessPayload
|
||||
);
|
||||
export const updateMyPortfolioError = createAction(
|
||||
types.updateMyPortfolioError
|
||||
);
|
||||
|
||||
export const validateUsername = createAction(types.validateUsername);
|
||||
export const validateUsernameComplete = createAction(
|
||||
types.validateUsernameComplete
|
||||
|
||||
@@ -15,7 +15,13 @@ import {
|
||||
putUpdateMyProfileUI,
|
||||
putUpdateMyUsername,
|
||||
putUpdateUserFlag,
|
||||
putVerifyCert
|
||||
putUpdateMySocials,
|
||||
putUpdateMyHonesty,
|
||||
putUpdateMyQuincyEmail,
|
||||
putVerifyCert,
|
||||
putUpdateMyPortfolio,
|
||||
putUpdateMyTheme,
|
||||
putUpdateMySound
|
||||
} from '../../utils/ajax';
|
||||
import { certMap } from '../../resources/cert-and-project-map';
|
||||
import { completedChallengesSelector } from '..';
|
||||
@@ -31,7 +37,19 @@ import {
|
||||
submitProfileUIComplete,
|
||||
submitProfileUIError,
|
||||
verifyCertComplete,
|
||||
verifyCertError
|
||||
verifyCertError,
|
||||
updateMySocialsComplete,
|
||||
updateMySocialsError,
|
||||
updateMyHonestyError,
|
||||
updateMyHonestyComplete,
|
||||
updateMyQuincyEmailComplete,
|
||||
updateMyQuincyEmailError,
|
||||
updateMyPortfolioError,
|
||||
updateMyPortfolioComplete,
|
||||
updateMyThemeComplete,
|
||||
updateMyThemeError,
|
||||
updateMySoundComplete,
|
||||
updateMySoundError
|
||||
} from './';
|
||||
|
||||
function* submitNewAboutSaga({ payload }) {
|
||||
@@ -76,6 +94,66 @@ function* updateUserFlagSaga({ payload: update }) {
|
||||
}
|
||||
}
|
||||
|
||||
function* updateMySocialsSaga({ payload: update }) {
|
||||
try {
|
||||
const response = yield call(putUpdateMySocials, update);
|
||||
yield put(updateMySocialsComplete({ ...response, payload: update }));
|
||||
yield put(createFlashMessage({ ...response }));
|
||||
} catch (e) {
|
||||
yield put(updateMySocialsError);
|
||||
}
|
||||
}
|
||||
|
||||
function* updateMySoundSaga({ payload: update }) {
|
||||
try {
|
||||
const response = yield call(putUpdateMySound, update);
|
||||
yield put(updateMySoundComplete({ ...response, payload: update }));
|
||||
yield put(createFlashMessage({ ...response }));
|
||||
} catch (e) {
|
||||
yield put(updateMySoundError);
|
||||
}
|
||||
}
|
||||
|
||||
function* updateMyThemeSaga({ payload: update }) {
|
||||
try {
|
||||
const response = yield call(putUpdateMyTheme, update);
|
||||
yield put(updateMyThemeComplete({ ...response, payload: update }));
|
||||
yield put(createFlashMessage({ ...response }));
|
||||
} catch (e) {
|
||||
yield put(updateMyThemeError);
|
||||
}
|
||||
}
|
||||
|
||||
function* updateMyHonestySaga({ payload: update }) {
|
||||
try {
|
||||
const response = yield call(putUpdateMyHonesty, update);
|
||||
yield put(updateMyHonestyComplete({ ...response, payload: update }));
|
||||
yield put(createFlashMessage({ ...response }));
|
||||
} catch (e) {
|
||||
yield put(updateMyHonestyError);
|
||||
}
|
||||
}
|
||||
|
||||
function* updateMyQuincyEmailSaga({ payload: update }) {
|
||||
try {
|
||||
const response = yield call(putUpdateMyQuincyEmail, update);
|
||||
yield put(updateMyQuincyEmailComplete({ ...response, payload: update }));
|
||||
yield put(createFlashMessage({ ...response }));
|
||||
} catch (e) {
|
||||
yield put(updateMyQuincyEmailError);
|
||||
}
|
||||
}
|
||||
|
||||
function* updateMyPortfolioSaga({ payload: update }) {
|
||||
try {
|
||||
const response = yield call(putUpdateMyPortfolio, update);
|
||||
yield put(updateMyPortfolioComplete({ ...response, payload: update }));
|
||||
yield put(createFlashMessage({ ...response }));
|
||||
} catch (e) {
|
||||
yield put(updateMyPortfolioError);
|
||||
}
|
||||
}
|
||||
|
||||
function* validateUsernameSaga({ payload }) {
|
||||
try {
|
||||
const { exists } = yield call(getUsernameExists, payload);
|
||||
@@ -134,6 +212,12 @@ function* verifyCertificationSaga({ payload }) {
|
||||
export function createSettingsSagas(types) {
|
||||
return [
|
||||
takeEvery(types.updateUserFlag, updateUserFlagSaga),
|
||||
takeEvery(types.updateMySocials, updateMySocialsSaga),
|
||||
takeEvery(types.updateMyHonesty, updateMyHonestySaga),
|
||||
takeEvery(types.updateMySound, updateMySoundSaga),
|
||||
takeEvery(types.updateMyTheme, updateMyThemeSaga),
|
||||
takeEvery(types.updateMyQuincyEmail, updateMyQuincyEmailSaga),
|
||||
takeEvery(types.updateMyPortfolio, updateMyPortfolioSaga),
|
||||
takeLatest(types.submitNewAbout, submitNewAboutSaga),
|
||||
takeLatest(types.submitNewUsername, submitNewUsernameSaga),
|
||||
debounce(2000, types.validateUsername, validateUsernameSaga),
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
/* eslint-disable require-yield */
|
||||
|
||||
import { takeEvery } from 'redux-saga/effects';
|
||||
import store from 'store';
|
||||
|
||||
const soundKey = 'fcc-sound';
|
||||
|
||||
export function setSound(setting) {
|
||||
store.set(soundKey, setting);
|
||||
}
|
||||
|
||||
function* updateLocalSoundSaga({ payload }) {
|
||||
const { user, sound } = payload ?? {};
|
||||
if (user) {
|
||||
const { sound = false } = user;
|
||||
setSound(sound);
|
||||
} else if (typeof sound !== 'undefined') {
|
||||
setSound(sound);
|
||||
}
|
||||
}
|
||||
|
||||
export function createSoundModeSaga(types) {
|
||||
return [
|
||||
takeEvery(types.fetchUserComplete, updateLocalSoundSaga),
|
||||
takeEvery(types.updateUserFlagComplete, updateLocalSoundSaga)
|
||||
];
|
||||
}
|
||||
@@ -262,6 +262,42 @@ export function putUpdateUserFlag(
|
||||
return put('/update-user-flag', update);
|
||||
}
|
||||
|
||||
export function putUpdateMySocials(
|
||||
update: Record<string, string>
|
||||
): Promise<void> {
|
||||
return put('/update-my-socials', update);
|
||||
}
|
||||
|
||||
export function putUpdateMySound(
|
||||
update: Record<string, string>
|
||||
): Promise<void> {
|
||||
return put('/update-my-sound', update);
|
||||
}
|
||||
|
||||
export function putUpdateMyTheme(
|
||||
update: Record<string, string>
|
||||
): Promise<void> {
|
||||
return put('/update-my-theme', update);
|
||||
}
|
||||
|
||||
export function putUpdateMyHonesty(
|
||||
update: Record<string, string>
|
||||
): Promise<void> {
|
||||
return put('/update-my-honesty', update);
|
||||
}
|
||||
|
||||
export function putUpdateMyQuincyEmail(
|
||||
update: Record<string, string>
|
||||
): Promise<void> {
|
||||
return put('/update-my-quincy-email', update);
|
||||
}
|
||||
|
||||
export function putUpdateMyPortfolio(
|
||||
update: Record<string, string>
|
||||
): Promise<void> {
|
||||
return put('/update-my-portfolio', update);
|
||||
}
|
||||
|
||||
export function putUserAcceptsTerms(quincyEmails: boolean): Promise<void> {
|
||||
return put('/update-privacy-terms', { quincyEmails });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user