Нанять+Плюс! Для сотрудников Вот как я его создал (Redux — Работа)

Назначение: Кандидат сможет просматривать вакансии и детали отдельных вакансий.

Типы, действия и редукторы: Состояние вакансии

Типы

внутри app > features > job > jobTypes.ts.
Типы данных для задания.

export type JobData = {
    id: string;
    companyName: string;
    position: string;
    location: string;
    salary: string;
    datePosted: string;
    jobType: string;
    applyUrl: string;
    description: string;
};
Вход в полноэкранный режим Выход из полноэкранного режима

Действия

внутри app > features > job > jobSlice.ts
Начальное состояние для job reducer. getPostedJobs получает все задания из БД и возвращает их строковую версию. getPostedJobById получает одно задание по id и возвращает его строковую версию.

import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import { getJobById, getJobs } from '../../../utils/firebase/firebase.utils';
import { JobData } from './jobTypes';

interface jobState {
    jobs: JobData[];
    isLoading: boolean;
}
const initialState: jobState = {
    jobs: [],
    isLoading: false,
};

export const getPostedJobs = createAsyncThunk('job/getJobs', async () => {
    const jobs = await getJobs();
    return JSON.stringify(jobs);
});
export const getPostedJobById = createAsyncThunk(
    'job/getJobById',
    async (id: string) => {
        const jobs = await getJobById(id);
        const [jobObj] = jobs;
        return JSON.stringify(jobObj);
    }
);
Вход в полноэкранный режим Выход из полноэкранного режима

Редуктор

Обрабатывает состояния ответа и устанавливает состояние соответствующим образом.

const JobSlice = createSlice({
    name: 'job',
    initialState,
    reducers: {},
    extraReducers: (builder) => {
        builder
            .addCase(getPostedJobs.pending, (state) => {
                state.isLoading = true;
            })
            .addCase(getPostedJobs.fulfilled, (state, action) => {
                state.isLoading = false;
                state.jobs = JSON.parse(action.payload);
            })
            .addCase(getPostedJobs.rejected, (state, action) => {
                state.isLoading = false;
                console.log('error with jobs', action.error);
            })
            .addCase(getPostedJobById.pending, (state) => {
                state.isLoading = true;
            })
            .addCase(getPostedJobById.fulfilled, (state, action) => {
                state.isLoading = false;
                state.jobs = JSON.parse(action.payload);
            })
            .addCase(getPostedJobById.rejected, (state, action) => {
                state.isLoading = false;
                console.log('error with getting job by id', action.error);
            });
    },
});

export default JobSlice.reducer;
Вход в полноэкранный режим Выход из полноэкранного режима

Это все для части проекта, связанной с работой/редуктором, следите за новостями!

Оцените статью
devanswers.ru
Добавить комментарий