Через метод fetch с помощью createAsyncThunk (TypeScript) пост добавляется, но в UI текст поста не виден

Когда с помощью createAsycnThunk на TypeScript создаю новый пост, то он добавляется без ошибок, но в UI в списке постов он отображается некорректно, то есть: текст поста не видно. // это слайс

import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";

type Post = {
    id: number,
    userId: number,
    title: string | number,
    body: string | number
}

type Posts = {
    posts: Array<Post>
}

const initialState: Posts = {
    posts: []
}

export const fetchPosts = createAsyncThunk<Post[], undefined, {rejectValue: string}> (
    'posts/fetchPosts',
    async function (_, {rejectWithValue}) {
            const response = await fetch('https://jsonplaceholder.typicode.com/posts/?_limit=5');
            if(!response.ok){
                return rejectWithValue('oops can not find posts')
            }
        const data = await response.json();
        return data;
    }
);

export const fetchAddPost = createAsyncThunk<Post, string, {rejectValue: string}>(
    'posts/fetchAddPost',
    async function (text, {rejectWithValue}) {
        console.log(text)
        const post = {
            userId: 1,
            title: 'my title',
            body: text
        }
        const response = await fetch('https://jsonplaceholder.typicode.com/posts/', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({post})
        });

        if(!response.ok) {
            return rejectWithValue('oops, can not to add new post')
        }
        
        return (await response.json()) as Post;
    }
)

const postsSlice = createSlice({
    name: 'posts',
    initialState,
    reducers: {},
    extraReducers: (builder) => {
        builder
            .addCase(fetchPosts.fulfilled, (state, action) => {
                console.log('fetchPosts: was fulfilled');
                state.posts = action.payload;
            })
            .addCase(fetchAddPost.fulfilled, (state, action) => {
                console.log('fetchAddPost: was fulfilled');
                
                state.posts.push(action.payload);
            })  
    }
})

export const {  } = postsSlice.actions;
export default postsSlice.reducer;

//это мой App

import {  useState } from 'react';
import './App.css';
import { useAppDispatch, useAppSelector } from './store/hooks';
import { fetchAddPost, fetchPosts } from './store/postsSlice';


const App: React.FC = () => {

  const [text, setText] = useState('');
  const posts = useAppSelector( state => state.posts.posts);
  const dispatch = useAppDispatch();
  
  return (
    <div>
      <button onClick={() => {dispatch(fetchPosts())}}>show posts</button>
      <div>
        <div>
          <input type="text" value={text} onChange={(e) => {setText(e.target.value)}} />
        <button onClick={() => {dispatch(fetchAddPost(text))}} >add new post</button>
      </div>
      <ul>
        {posts.map((post) => {
          return <li key={post.id} >{post.id}. {post.body}
          <div>
            <button>delete post</button>
          </div>
          </li>
        })}
      </ul>
      
      </div>
    </div>
  )
}

export default App;

// это store

import { configureStore } from "@reduxjs/toolkit";
import postsSlice from "./postsSlice";

const store = configureStore({
    reducer: {
        posts: postsSlice
    }
})

export type RootState = ReturnType<typeof store.getState>
export type AppDispatch = typeof store.dispatch;

export default store;

// это hooks

import { RootState, AppDispatch } from './store';
import { useSelector, useDispatch } from "react-redux";
import type { TypedUseSelectorHook } from 'react-redux';

export const useAppDispatch  = () => useDispatch<AppDispatch>();
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;

Ответы (0 шт):