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

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

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

Типы

внутри app > features > company > companyTypes.ts.

Типы данных для компании. У меня есть JobData, импортированные из diff-файла, но я показываю бок о бок для простоты.

export type CompanyData = {
 id: string;
 companyName: string;
 companyDescription: string;
 companyUrl: string;
 email: string;
 isHiring: boolean;
 companySize: string;
 jobs: JobData[];
};

export type JobData = {
 id: string;
 companyName: string;
 position: string;
 location: string;
 salary: string;
 datePosted: string;
 jobType: string;
 applyUrl: string;
 description: string;
};

Вход в полноэкранный режим Выход из полноэкранного режима

Действия

внутри app > features > company > companySlice.ts
устанавливаю начальное состояние для company reducer, и вызываю getCompany из DB для получения компании по id. Я возвращаю стрингвизированную версию company.

import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import { getCompanyById } from '../../../utils/firebase/firebase.utils';
import { CompanyData } from './companyTypes';

interface companyState {
 company: CompanyData;
 isLoading: boolean;
}
const initialState: companyState = {
 company: {
   id: '',
   companyName: '',
   companyDescription: '',
   companyUrl: '',
   email: '',
   isHiring: false,
   companySize: '',
   jobs: [],
 },
 isLoading: false,
};

export const getCompany = createAsyncThunk(
 'job/getCompanyById',
 async (id: string) => {
 const company = await getCompanyById(id);
 const [companyObj] = company;
 return JSON.stringify(companyObj);
 }
);

Вход в полноэкранный режим Выход из полноэкранного режима

Редукторы

Я обработал состояния ответа и установил состояние в соответствии с ним.
В состоянии ответа .fulfilled я получаю эти данные обратно, разбираю их и устанавливаю в состояние.

const companySlice = createSlice({
 name: 'job',
 initialState,
 reducers: {},
 extraReducers: (builder) => {
  builder
   .addCase(getCompany.pending, (state, action) => {
     state.isLoading = true;
   })
   .addCase(getCompany.fulfilled, (state, action) => {
     state.isLoading = false;
     state.company = JSON.parse(action.payload);
   })
   .addCase(getCompany.rejected, (state, action) => {
     state.isLoading = false;
     console.log('error with company data', action.error);
   });
 },
});

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

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

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