Browse Source

02.04.2023 03:00

Volddemar4ik 1 year ago
parent
commit
3f6112ae49

+ 1 - 1
js/Project/project/src/App(my).js

@@ -47,7 +47,7 @@ function App() {
                             <Route path="/registration" component={Registration} />
                             <Route path="/post/:postId" component={CComments} />
                             <Route path="/user/:userId" component={CUser} />
-                            <Route path="/createpost" component={CreatePost} />
+                            <Route path="/upsertpost" component={CreatePost} />
                             {/* <Route path="/about" component={PageAbout} /> */}
                             <Route path="*" component={Page404} />
                             {/* <Page404 /> - это аналог записи выше */}

+ 1 - 1
js/Project/project/src/App.js

@@ -32,7 +32,7 @@ const MyRoutes = () => {
             <Route path="/" component={CFeed} exact />
             <Route path="/post/:postId" component={CComments} />
             <Route path="/user/:userId" component={CUser} />
-            <Route path="/createpost" component={CreatePost} />
+            <Route path="/upsertpost" component={CreatePost} />
             <Route path="/updateprofile" component={UpsertProfile} />
             <Route path='/search' component={Search} />
             <Route path="*" component={Page404} />

+ 1 - 1
js/Project/project/src/App_test.js

@@ -47,7 +47,7 @@ function App() {
               <Route path="/registration" component={Registration} />
               <Route path="/post/:postId" component={CComments} />
               <Route path="/user/:userId" component={CUser} />
-              <Route path="/createpost" component={CreatePost} />
+              <Route path="/upsertpost" component={CreatePost} />
               {/* <Route path="/about" component={PageAbout} /> */}
               <Route path="*" component={Page404} />
               {/* <Page404 /> - это аналог записи выше */}

+ 64 - 0
js/Project/project/src/components/auth_reg/login_form.js

@@ -1,5 +1,6 @@
 import React, {
     forwardRef,
+    useEffect,
     useState
 } from 'react';
 import { store } from '../../redux';
@@ -64,6 +65,61 @@ function LoginForm() {
     // проверяем данные только после ухода с фокуса(чтобы при открытии страницы сразу не горело красным все)
     const [passwordInFocus, setPassworInFocus] = useState(false)
 
+
+
+
+
+    // const [onFocus, setOnFocus] = useState(false)
+    // console.log('onFosuc: ', onFocus)
+    // function isOnFocus() {
+    //     setOnFocus(true)
+    //     // setIsLoginValid(true)
+    //     // setIsPasswordValid(true)
+    //     // setIsPasswordConfirmValid(true)
+    // }
+
+    // const [isFullDataValid, setIsFullDataValid] = useState(true)
+    // console.log('MAIN: ', isFullDataValid)
+
+    // const [isLoginValid, setIsLoginValid] = useState(false)
+    // console.log('isLoginValid: ', isLoginValid)
+
+    // const [isPasswordValid, setIsPasswordValid] = useState(false)
+    // console.log('isPasswordValid: ', isPasswordValid)
+
+    // const [isPasswordConfirmValid, setIsPasswordConfirmValid] = useState(false)
+    // console.log('isPasswordConfirmValid: ', isPasswordConfirmValid)
+
+    // // регулярка для проверка пароля
+    // const patternPassword = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
+    // // регулярка для проверки логина на латинские символы и цифры
+    // const patternLogin = /^[a-zA-Z0-9]+$/
+
+    // // функция проверки пароля, которая запускается, когда уходит фокус с поля пароля
+    // useEffect(() => {
+    //     if (onFocus) {
+    //         // провекар логина на валид
+    //         setIsLoginValid(patternLogin.test(data?.login))
+
+    //         // провекар пароль на валид
+    //         setIsPasswordValid(patternPassword.test(data?.pass))
+
+    //         // провекар подтверждение пароля на валид
+    //         setIsPasswordConfirmValid(data?.pass === data?.confirmPass)
+
+    //         // //  общая проверка
+    //         // setIsFullDataValid(onFocus && isLoginValid && isPasswordValid && isPasswordConfirmValid)
+    //         setIsFullDataValid(!(true && !(isLoginValid && isPasswordValid && isPasswordConfirmValid)))
+    //     }
+
+    //     //  общая проверка
+
+    // }, [data])
+
+
+
+
+
     // функция проверки пароля, которая запускается, когда уходит фокус с поля пароля
     function isPasswordValid() {
         setPassworInFocus(true)
@@ -179,6 +235,7 @@ function LoginForm() {
                                     variant="outlined"
                                     onClick={handleTooltipOpenLogin}
                                     error={!location && passwordInFocus && !isDataValid}
+                                // error={!location && isLoginValid}
                                 >
                                     <InputLabel htmlFor="outlined-adornment-password">Логин</InputLabel>
                                     <OutlinedInput
@@ -190,6 +247,7 @@ function LoginForm() {
                                         value={data.login}
                                         onChange={e => setData({ ...data, login: e.target.value })}
                                         onBlur={isPasswordValid}
+                                        // onFocus={isOnFocus}
 
                                         endAdornment={
                                             <InputAdornment position="end">
@@ -234,6 +292,7 @@ function LoginForm() {
                                     variant="outlined"
                                     onClick={handleTooltipOpen}
                                     error={!location && passwordInFocus && !isDataValid}
+                                // error={!location && isPasswordValid}
                                 >
                                     <InputLabel htmlFor="outlined-adornment-password">Пароль</InputLabel>
                                     <OutlinedInput
@@ -245,6 +304,7 @@ function LoginForm() {
                                         value={data.pass}
                                         onChange={e => setData({ ...data, pass: e.target.value })}
                                         onBlur={isPasswordValid}
+                                        // onFocus={isOnFocus}
 
                                         endAdornment={
                                             <InputAdornment position="end">
@@ -268,6 +328,7 @@ function LoginForm() {
                     {!location && <FormControl
                         variant="outlined"
                         error={passwordInFocus && !isDataValid}
+                    // error={isPasswordConfirmValid}
                     >
                         <InputLabel htmlFor="outlined-adornment-password">Подтвердите пароль</InputLabel>
                         <OutlinedInput
@@ -279,6 +340,7 @@ function LoginForm() {
                             value={data.confirmPass}
                             onChange={e => setData({ ...data, confirmPass: e.target.value })}
                             onBlur={isPasswordValid}
+                            // onFocus={isOnFocus}
 
                             endAdornment={
                                 <InputAdornment position="end">
@@ -302,6 +364,8 @@ function LoginForm() {
                         disabled={location
                             ? (isDataValid || false)
                             : !isDataValid}
+                        // ? (isFullDataValid || false)
+                        // : isFullDataValid}
                         onClick={location ? fullLogin : fullRegistration}
                     >
                         {location

+ 4 - 83
js/Project/project/src/components/feed/test.js

@@ -1,83 +1,4 @@
-import React, { useEffect, useState } from 'react';
-import { connect } from 'react-redux';
-import { Box, Divider, Paper } from '@mui/material';
-import { styled } from '@mui/material/styles';
-import { Container } from '@mui/system';
-import Grid2 from '@mui/material/Unstable_Grid2/Grid2';
-import { actionAboutMe, actionDownloadFeed } from '../../redux/thunks';
-import { CardFeed } from './card';
-import { CAboutMe } from './aboutMe';
-import Recommended from './recommended';
-
-const Item = styled(Paper)(() => ({
-    padding: '0 10px',
-    marginBottom: 10,
-    borderRadius: 0,
-    boxShadow: 'none',
-}))
-
-function Feed({ feed, loadFeed }) {
-    const [loading, setLoading] = useState(false);
-    const [page, setPage] = useState(feed);
-
-    const handleScroll = () => {
-        if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
-            setPa(dispatch(actionDownloadFeed()))
-        }
-    };
-
-    useEffect(() => {
-        loadFeed();
-        window.addEventListener('scroll', handleScroll);
-        return () => window.removeEventListener('scroll', handleScroll);
-    }, []);
-
-    useEffect(() => {
-        if (!loading) return;
-        setLoading(true);
-        loadFeed(page).then(() => setLoading(false));
-    }, [page]);
-
-    const renderFeed = () => {
-        if (!feed) return null;
-        const filteredFeed = feed.filter(
-            (item, index, self) =>
-                index === self.findIndex((t) => t._id === item._id)
-        );
-        return filteredFeed.map((post) => (
-            <Item key={post._id}>
-                <CardFeed postData={post} />
-            </Item>
-        ));
-    };
-
-    return (
-        <Container sx={{ width: '90%', mt: 1 }}>
-            <Box sx={{ flexGrow: 1 }}>
-                <Grid2 container spacing={2}>
-                    <Grid2
-                        xs={7}
-                        sx={{ display: 'flex', justifyContent: 'center' }}
-                    >
-                        <Item>{renderFeed()}</Item>
-                    </Grid2>
-                    <Grid2
-                        xs={5}
-                        sx={{ display: 'flex', justifyContent: 'center' }}
-                    >
-                        <Item sx={{ position: 'fixed' }}>
-                            <CAboutMe />
-                            <Recommended />
-                        </Item>
-                    </Grid2>
-                </Grid2>
-            </Box>
-        </Container>
-    );
-}
-
-export const CFeed = connect(
-    (state) => ({ feed: state.feed?.MyFeed?.payload }),
-    { loadFeed: actionAboutMe }
-)(Feed);
-
+const [isFullDataValid, setIsFullDataValid] = useState(false)
+const [isLoginValid, setIsLoginValid] = useState(false)
+const [isPasswordValid, setIsPasswordValid] = useState(false)
+const [isPasswordConfirmValid, setIsPasswordConfirmValid] = useState(false)

+ 5 - 2
js/Project/project/src/components/functions/index.js

@@ -1,5 +1,4 @@
 // Функция формирования даты поста
-
 export function createDate(date) {
     const dateOfPost = new Date(date)
 
@@ -19,4 +18,8 @@ export function createDate(date) {
     ]
 
     return `${dateOfPost.getDate() < 10 ? '0' + dateOfPost.getDate() : dateOfPost.getDate()} ${months[dateOfPost.getMonth()]} ${dateOfPost.getFullYear()}  ${dateOfPost.getHours()}:${dateOfPost.getMinutes() < 10 ? '0' + dateOfPost.getMinutes() : dateOfPost.getMinutes()}`
-}
+}
+
+
+
+// функция проверки пароля на валидность

+ 1 - 1
js/Project/project/src/components/structure/header.js

@@ -67,7 +67,7 @@ function UserMenu({ user }) {
     }
 
     function toCreatepost() {
-        history.push('/createpost')
+        history.push('/upsertpost')
     }
 
     function toMyAccount() {

+ 443 - 0
js/Project/project/src/components/user/change_data.js

@@ -0,0 +1,443 @@
+import { url } from "../../App"
+
+import React, { useContext, useEffect, useState } from 'react';
+import { useHistory, useParams } from 'react-router-dom';
+import { useDispatch, useSelector } from 'react-redux';
+
+
+import { CardContent, Typography, Stack, Avatar, Box, Container, Badge, TextField, InputAdornment, Backdrop, Modal, Fade, IconButton, Divider } from '@mui/material';
+import Button from '@mui/material-next/Button';
+import { PersonRemoveRounded, PersonAddRounded, ManageAccountsRounded, BorderColorRounded, ImageSearchRounded, AccountCircle, HttpsRounded, Close } from '@mui/icons-material';
+import { actionUserPageSubscribing, actionFullPassChange, actionFullLogout } from "../../redux/thunks";
+
+import ModalWindow from '../structure/modal';
+import { ModalForCountsContext, UpdateProfile } from "../../App";
+import { actionPassChange } from "../../redux/action";
+
+import { EditProfile } from ".";
+
+
+const style = {
+    position: 'absolute',
+    top: '50%',
+    left: '50%',
+    transform: 'translate(-52.5%, -52.5%)',
+    width: 350,
+    height: 'fit-content',
+    bgcolor: 'background.paper',
+    boxShadow: 24,
+    outline: 0,
+    borderRadius: 3,
+    padding: '5px 0'
+};
+
+
+
+export default function ChangeData() {
+    const dispatch = useDispatch()
+
+    // отслеживание в полях ввода новые данные для пароля
+    const [newPasswordData, setNewPasswordData] = useState({ login: '', oldPassword: '', newPassword: '' })
+    console.log('newPasswordData: ', newPasswordData)
+
+    // контекст обновления профиля
+    // const [updateProfile, setUpdateProfile] = useContext(UpdateProfile)
+
+    // отслеживаем состояние открытия модального окна
+    const [changePassword, setChangePassword] = useState(false)
+
+    // отслеживаем, удачно изменился пароль или нет
+    const [isSuccessChange, setIsSuccessChange] = useState(false)
+
+    // отображение окна о том, удачно/нет завершилось обновление пароля
+    const [alertSuccess, setAlertSuccess] = useState(true)
+
+    // отслеживание валидации нового пароля
+    const [isDataValid, setIsDataValid] = useState(false)
+    const patternPassword = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
+
+    useEffect(() => {
+        setIsDataValid(patternPassword.test(newPasswordData.newPassword))
+    }, [newPasswordData.newPassword])
+
+
+    // открытие модального окна редактирвоания пароля
+    function changePasswordOpen() {
+        setChangePassword(true)
+    }
+
+    // закрытие модального окна редактирвоания пароля
+    function changePasswordClose() {
+        setChangePassword(false)
+    }
+
+    // отправка запроса на изменение пароля
+    async function editNewPassword() {
+
+        if (isDataValid) {
+            // бекапим токен
+            let backupToken = localStorage.getItem('authToken');
+
+            // удаляем токен из локала
+            localStorage.removeItem('authToken')
+
+            // диспатчим смену пароля
+            const result = await dispatch(actionFullPassChange(newPasswordData.login, newPasswordData.oldPassword, newPasswordData.newPassword))
+
+            if (result) {
+                // закрываем окно с полями ввода для нового пароля
+                setIsSuccessChange(true)
+
+                // открываем окно, что пошло все так
+                setAlertSuccess(true)
+            } else {
+                // записываем обратно в локал токен, чтобы не выбросило с акка
+                localStorage.setItem('authToken', backupToken)
+
+                // закрываем окно с полями ввода для нового пароля
+                setIsSuccessChange(true)
+
+                // открываем окно, что пошло что-то не так
+                setAlertSuccess(false)
+            }
+        }
+
+    }
+
+    // действие кнопки на окне удачного/неудачного изменения пароля (НЕудачно - снова открываем поля ввода пароляб удачно - выбрасываем из ака)
+    function isSuccess() {
+        if (!alertSuccess) {
+            setIsSuccessChange(false)
+        } else {
+            dispatch(actionFullLogout())
+        }
+    }
+
+
+    // запрос на полное изменение данных
+    function fullChangeData() {
+        console.log('click')
+    }
+
+
+    return (
+        <React.Fragment>
+            <Box
+                sx={{
+                    display: 'flex',
+                    flexDirection: 'column',
+                    marginLeft: '50px '
+                }}
+            >
+                <Stack
+                    sx={{
+                        justifyContent: 'space-between',
+                        marginBottom: '10px'
+                    }}
+                    direction="row"
+                    spacing={2}
+                >
+                    <Box
+                        sx={{
+                            display: 'flex',
+                            alignItems: 'flex-end'
+                        }}>
+                        <AccountCircle
+                            sx={{
+                                color: 'action.active',
+                                mr: 1, my: 0.5
+                            }} />
+                        <TextField
+                            id="input-new-login"
+                            label="Новый логин"
+                            variant="standard" />
+                    </Box>
+
+                    <Box
+                        sx={{
+                            display: 'flex',
+                            alignItems: 'flex-end'
+                        }}>
+                        <AccountCircle
+                            sx={{
+                                color: 'action.active',
+                                mr: 1, my: 0.5
+                            }} />
+                        <TextField
+                            id="input-new-nick"
+                            label="Новый ник-нейм"
+                            variant="standard" />
+                    </Box>
+                </Stack>
+
+                <Stack
+                    sx={{
+                        justifyContent: 'space-between',
+                        marginBottom: '10px'
+                    }}
+                    direction="row"
+                    spacing={2}
+                >
+                    <Box
+                        onClick={changePasswordOpen}
+                    >
+                        <Button
+                            sx={{
+                                padding: '5px 20px'
+                            }}
+                            size="small"
+                            variant="text"
+                        >
+                            Редактировать пароль
+                        </Button>
+                    </Box>
+                </Stack>
+
+                <Box
+                    onClick={fullChangeData}
+                >
+                    <Button
+                        size="small"
+                        variant="filledTonal"
+                        sx={{
+                            maxWidth: '300px'
+                        }}
+                    >
+                        Сохранить изменения
+                    </Button>
+                </Box>
+            </Box>
+
+            <Modal
+                aria-labelledby="transition-modal-title"
+                aria-describedby="transition-modal-description"
+                open={changePassword}
+                // onClose={changePasswordClose}
+                closeAfterTransition
+                slots={{ backdrop: Backdrop }}
+                slotProps={{
+                    backdrop: {
+                        timeout: 500,
+                    },
+                }}
+            >
+                <Fade in={changePassword}>
+                    <Box sx={style}>
+                        <Stack
+                            direction="row"
+                            justifyContent="space-between"
+                            alignItems="center"
+                            sx={{
+                                padding: '0 24px'
+                            }}>
+                            <Typography
+                                variant="subtitle1"
+                                color='text.primary'
+                                gutterBottom
+                            >
+                                Редактирование пароля
+                            </Typography>
+
+                            {!isSuccessChange &&
+                                <IconButton
+                                    onClick={changePasswordClose}
+                                    title='Закрыть'
+                                >
+                                    <Close
+                                        sx={{
+                                            position: 'absolute',
+                                            color: 'black'
+                                        }}
+                                        fontSize='medium'
+                                    />
+                                </IconButton>}
+                        </Stack>
+
+                        <Divider />
+
+                        {!isSuccessChange &&
+                            <Box
+                                sx={{
+                                    margin: '8px 0 8px 8px',
+                                    width: '95%',
+                                    minHeight: 'fit-content',
+                                    maxHeight: 350,
+                                    overflowY: 'auto'
+                                }}>
+                                <Stack
+                                    direction="column"
+                                    spacing={2}
+                                    sx={{
+                                        alignItems: 'center'
+                                    }}
+                                >
+                                    <Box
+                                        sx={{
+                                            display: 'flex',
+                                            alignItems: 'flex-end',
+                                            width: '90%'
+                                        }}>
+                                        <AccountCircle
+                                            sx={{
+                                                color: 'action.active',
+                                                mr: 1, my: 0.5,
+                                            }} />
+                                        <TextField
+                                            id="input-new-login"
+                                            label="Логин"
+                                            variant="standard"
+                                            fullWidth
+                                            value={newPasswordData.login}
+                                            onChange={e => setNewPasswordData({ ...newPasswordData, login: e.target.value })}
+                                            sx={{
+                                                width: '100%'
+                                            }}
+                                        />
+                                    </Box>
+
+                                    <Box
+                                        sx={{
+                                            display: 'flex',
+                                            alignItems: 'flex-end',
+                                            width: '90%'
+                                        }}>
+                                        <HttpsRounded
+                                            sx={{
+                                                color: 'action.active',
+                                                mr: 1, my: 0.5
+                                            }} />
+                                        <TextField
+                                            id="input-new-login"
+                                            label="Старый пароль"
+                                            variant="standard"
+                                            fullWidth
+                                            value={newPasswordData.oldPassword}
+                                            onChange={e => setNewPasswordData({ ...newPasswordData, oldPassword: e.target.value })}
+                                        />
+                                    </Box>
+
+                                    <Box
+                                        sx={{
+                                            display: 'flex',
+                                            alignItems: 'flex-end',
+                                            width: '90%'
+                                        }}>
+                                        <HttpsRounded
+                                            sx={{
+                                                color: 'action.active',
+                                                mr: 1, my: 0.5
+                                            }} />
+                                        <TextField
+                                            error={!isDataValid}
+                                            id="input-new-login"
+                                            label="Новый пароль"
+                                            variant="standard"
+                                            fullWidth
+                                            value={newPasswordData.newPassword}
+                                            onChange={e => setNewPasswordData({ ...newPasswordData, newPassword: e.target.value })}
+                                        />
+                                    </Box>
+
+                                    <Box
+                                        onClick={editNewPassword}
+                                    >
+                                        <Button
+                                            disabled={!isDataValid}
+                                            size="small"
+                                            variant="filledTonal"
+                                            sx={{
+                                                padding: '5px 20px'
+                                            }}
+                                        >
+                                            Сохранить изменения
+                                        </Button>
+                                    </Box>
+                                </Stack>
+                            </Box>}
+
+                        {isSuccessChange &&
+                            <React.Fragment>
+                                {alertSuccess &&
+                                    <Box
+                                        sx={{
+                                            display: 'flex',
+                                            flexDirection: 'column',
+                                            alignItems: 'center',
+                                            paddingBottom: '10px'
+                                        }}
+                                    >
+                                        <Typography
+                                            variant="subtitle1"
+                                            gutterBottom
+                                            color='text.primary'
+                                            align='center'
+                                            sx={{
+                                                margin: '25px auto',
+                                                padding: '16px'
+                                            }}
+                                        >
+                                            Данные успешно изменены. Повторите вход в аккаунт.
+                                        </Typography>
+
+                                        <Box
+                                            onClick={isSuccess}
+                                        >
+                                            <Button
+                                                sx={{
+                                                    padding: '5px 20px',
+                                                }}
+                                                size="small"
+                                                variant="filledTonal"
+                                            >
+                                                Авторизоваться
+                                            </Button>
+                                        </Box>
+
+                                    </Box>}
+
+                                {!alertSuccess &&
+                                    <Box
+                                        sx={{
+                                            display: 'flex',
+                                            flexDirection: 'column',
+                                            alignItems: 'center',
+                                            paddingBottom: '10px'
+                                        }}
+                                    >
+                                        <Typography
+                                            variant="subtitle1"
+                                            gutterBottom
+                                            color='text.primary'
+                                            align='center'
+                                            sx={{
+                                                margin: '25px auto',
+                                                padding: '16px'
+                                            }}
+                                        >
+                                            Вы ввели неправильные логин или пароль. Повторите попытку
+                                        </Typography>
+
+                                        <Box
+                                            onClick={isSuccess}
+                                        >
+                                            <Button
+                                                sx={{
+                                                    padding: '5px 20px',
+                                                }}
+                                                size="small"
+                                                variant="filledTonal"
+                                            >
+                                                Ок
+                                            </Button>
+                                        </Box>
+
+                                    </Box>
+                                }
+                            </React.Fragment>
+                        }
+                    </Box>
+                </Fade>
+            </Modal>
+        </React.Fragment >
+    )
+}

+ 223 - 18
js/Project/project/src/components/user/gallery.js

@@ -1,27 +1,235 @@
+// import { url } from '../../App';
+
+// import React, { useContext, useEffect, useState } from 'react';
+// import { connect, useDispatch, useSelector } from 'react-redux';
+// import { useHistory } from 'react-router-dom';
+
+// import { Box } from '@mui/system';
+// import { IconButton, ImageList, ImageListItem, Typography } from '@mui/material';
+
+// import { AutoAwesomeMotionRounded, ReplyRounded, BorderColorRounded, DriveFileRenameOutlineRounded } from '@mui/icons-material';
+
+// import { actionDownloadUserFeed } from '../../redux/thunks';
+
+// import './style.scss'
+
+// import { EditProfile } from '.';
+
+
+// export default function StandardImageList({ images }) {
+//     const history = useHistory()
+//     const dispatch = useDispatch()
+
+//     // отслеживание старыых постов
+//     const [currentPosts, setCurrentPosts] = useState(images)
+//     console.log('currentPosts: ', currentPosts)
+
+
+
+
+
+//     // отслеживание нажатия кнопки редактирования профиля
+//     const [isEditProfile, setIsEditProfile] = useContext(EditProfile)
+
+//     // отслеживаем дозагрузку новых постов
+//     const newPosts = useSelector(state => state?.feed?.AddUserFeed?.payload)
+//     console.log('newPosts: ', newPosts)
+
+//     // когда пришли посты, делаем проверку на дубли и пушим в основную ленту
+//     if (newPosts) {
+//         newPosts.forEach((obj2) => {
+//             const obj1Exists = currentPosts?.some((obj1) => obj1?._id === obj2?._id);
+//             if (!obj1Exists) {
+//                 currentPosts?.push(obj2);
+//             }
+//         });
+//     }
+
+
+//     // функция отслеживания дна
+//     function handleScroll() {
+//         if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
+//             dispatch(actionDownloadUserFeed())
+//         }
+//     };
+
+
+//     // первая загрузка страницы и монтирование прослушки
+//     useEffect(() => {
+
+//         window.addEventListener('scroll', handleScroll);
+
+//         return () => window.removeEventListener('scroll', handleScroll);
+//     }, [])
+
+
+//     // стиль иконки на посте
+//     const iconStyle = {
+//         color: '#e8def8',
+//         // transform: 'scale(-1, 1)',
+//         position: 'absolute',
+//         right: '10px',
+//         top: '10px',
+//         fontSize: '32px'
+//     }
+
+//     // переход на пост при клике на его картинку
+//     function toPost(id) {
+//         if (isEditProfile) {
+//             history.push(`/upsertpost/${id}`)
+//         } else {
+//             history.push(`/post/${id}`)
+//         }
+
+//         setIsEditProfile(false)
+//     }
+
+//     return (currentPosts &&
+//         <ImageList
+//             sx={{
+//                 width: "100%",
+//                 minHeight: "100%"
+//             }}
+//             cols={3}
+//             rowHeight={'auto'}
+//         >
+//             {currentPosts?.map(item => (
+
+//                 <ImageListItem
+//                     key={item?._id}
+//                 >
+//                     {/* иконка галереи на посте в ленте */}
+//                     {(isEditProfile && <BorderColorRounded
+//                         sx={iconStyle}
+//                     />) ||
+//                         (item?.images?.length > 1) &&
+//                         <AutoAwesomeMotionRounded
+//                             sx={iconStyle}
+//                         />}
+
+//                     {/* пост в ленте */}
+//                     <Box
+//                         sx={{
+//                             width: '100%',
+//                             paddingTop: '100%',
+//                             backgroundSize: 'cover',
+//                             backgroundColor: 'black',
+//                             backgroundImage: `url(/images/noPhoto.png)`,
+//                             backgroundRepeat: 'no-repeat',
+//                             cursor: 'pointer',
+//                         }}
+
+//                         style={item?.images && (
+//                             item?.images[0]?.url &&
+//                             { backgroundImage: `url(${url + item?.images[0]?.url})` }
+//                         )}
+
+//                         onClick={() => {
+//                             toPost(item._id)
+//                         }}
+//                     />
+//                 </ImageListItem>
+//             ))
+//             }
+//         </ImageList >
+//     )
+// }
+
+// export const СStandardImageList = connect(state => ({ images: state?.feed?.UserFeed?.payload }))(StandardImageList)
+
+
+
+
+
 import { url } from '../../App';
 
-import * as React from 'react';
-import { connect } from 'react-redux';
+import React, { useContext, useEffect, useState } from 'react';
+import { connect, useDispatch, useSelector } from 'react-redux';
 import { useHistory } from 'react-router-dom';
 
 import { Box } from '@mui/system';
 import { IconButton, ImageList, ImageListItem, Typography } from '@mui/material';
 
-import { AutoAwesomeMotionRounded, ReplyRounded } from '@mui/icons-material';
+import { AutoAwesomeMotionRounded, ReplyRounded, BorderColorRounded, DriveFileRenameOutlineRounded } from '@mui/icons-material';
+
+import { actionDownloadUserFeed } from '../../redux/thunks';
 
 import './style.scss'
 
+import { EditProfile } from '.';
 
-export default function StandardImageList({ images }) {
 
+export default function StandardImageList({ images }) {
     const history = useHistory()
+    const dispatch = useDispatch()
+
+    // отслеживание старыых постов
+    const [currentPosts, setCurrentPosts] = useState(images)
+    console.log('currentPosts: ', currentPosts)
+
+
+    useEffect(() => {
+        setCurrentPosts(images)
+    }, [images])
+
+
+    // отслеживание нажатия кнопки редактирования профиля
+    const [isEditProfile, setIsEditProfile] = useContext(EditProfile)
+
+    // отслеживаем дозагрузку новых постов
+    const newPosts = useSelector(state => state?.feed?.AddUserFeed?.payload)
+    console.log('newPosts: ', newPosts)
+
+    // когда пришли посты, делаем проверку на дубли и пушим в основную ленту
+    if (newPosts) {
+        newPosts.forEach((obj2) => {
+            const obj1Exists = currentPosts?.some((obj1) => obj1?._id === obj2?._id);
+            if (!obj1Exists) {
+                currentPosts?.push(obj2);
+            }
+        });
+    }
+
+
+    // функция отслеживания дна
+    function handleScroll() {
+        if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
+            dispatch(actionDownloadUserFeed())
+        }
+    };
+
+
+    // первая загрузка страницы и монтирование прослушки
+    useEffect(() => {
+
+        window.addEventListener('scroll', handleScroll);
+
+        return () => window.removeEventListener('scroll', handleScroll);
+    }, [])
+
+
+    // стиль иконки на посте
+    const iconStyle = {
+        color: '#e8def8',
+        // transform: 'scale(-1, 1)',
+        position: 'absolute',
+        right: '10px',
+        top: '10px',
+        fontSize: '32px'
+    }
 
     // переход на пост при клике на его картинку
-    function toPost(name) {
-        history.push(`/post/${name}`)
+    function toPost(id) {
+        if (isEditProfile) {
+            history.push(`/upsertpost/${id}`)
+        } else {
+            history.push(`/post/${id}`)
+        }
+
+        setIsEditProfile(false)
     }
 
-    return (images &&
+    return (currentPosts &&
         <ImageList
             sx={{
                 width: "100%",
@@ -30,22 +238,19 @@ export default function StandardImageList({ images }) {
             cols={3}
             rowHeight={'auto'}
         >
-            {images?.map(item => (
+            {currentPosts?.map(item => (
 
                 <ImageListItem
                     key={item?._id}
                 >
                     {/* иконка галереи на посте в ленте */}
-                    {(item?.images?.length > 1) && <AutoAwesomeMotionRounded
-                        sx={{
-                            color: 'white',
-                            transform: 'scale(-1, 1)',
-                            position: 'absolute',
-                            right: '10px',
-                            top: '10px',
-                            fontSize: '32px'
-                        }}
-                    />}
+                    {(isEditProfile && <BorderColorRounded
+                        sx={iconStyle}
+                    />) ||
+                        (item?.images?.length > 1) &&
+                        <AutoAwesomeMotionRounded
+                            sx={iconStyle}
+                        />}
 
                     {/* пост в ленте */}
                     <Box

+ 14 - 6
js/Project/project/src/components/user/index.js

@@ -1,8 +1,9 @@
-import * as React from 'react';
-import { useEffect } from 'react';
+import React, { createContext, useEffect, useState } from 'react';
+// import { useEffect } from 'react';
 import { useParams } from 'react-router-dom';
 import { connect } from 'react-redux';
-import { store } from '../../redux';
+// import { store } from '../../redux';
+// import { useState } from 'react';
 
 import { Box, Container, Divider } from '@mui/material';
 
@@ -11,14 +12,20 @@ import { actionFindUserOne, actionFullUserFindOne } from '../../redux/thunks';
 
 import { StandardImageList, СStandardImageList } from './gallery';
 
+export const EditProfile = createContext()
+
 function User({ user = {}, loadUser }) {
     // console.log('user: ', user)
 
+    const [isEditProfile, setIsEditProfile] = useState(false)
+    // console.log('isEditProfile: ', isEditProfile)
+
     const { userId } = useParams()
     useEffect(() => { loadUser(userId) }, [userId])
 
     return (
-        <React.Fragment>
+        // <React.Fragment>
+        <EditProfile.Provider value={[isEditProfile, setIsEditProfile]}>
             <Box
                 sx={{
                     margin: "20px 50px"
@@ -29,10 +36,11 @@ function User({ user = {}, loadUser }) {
 
             <Divider />
 
-            <Box >
+            <Box>
                 <СStandardImageList />
             </Box>
-        </React.Fragment >
+            {/* </React.Fragment > */}
+        </EditProfile.Provider >
     );
 }
 

+ 374 - 131
js/Project/project/src/components/user/userData.js

@@ -1,17 +1,20 @@
 import { url } from "../../App"
 
-import React, { useContext } from 'react';
+import React, { useContext, useState } from 'react';
 import { useHistory, useParams } from 'react-router-dom';
 import { useDispatch, useSelector } from 'react-redux';
 
-import { CardContent, Typography, Stack, Avatar, Box, Container } from '@mui/material';
+import { CardContent, Typography, Stack, Avatar, Box, Container, Badge, TextField, InputAdornment } from '@mui/material';
 import Button from '@mui/material-next/Button';
-import { PersonRemoveRounded, PersonAddRounded, ManageAccountsRounded } from '@mui/icons-material';
+import { PersonRemoveRounded, PersonAddRounded, ManageAccountsRounded, BorderColorRounded, ImageSearchRounded, AccountCircle, HttpsRounded } from '@mui/icons-material';
 import { actionUserPageSubscribing } from "../../redux/thunks";
 
 import ModalWindow from '../structure/modal';
+import ChangeData from "./change_data";
 import { ModalForCountsContext, UpdateProfile } from "../../App";
 
+import { EditProfile } from ".";
+
 
 
 // Функция отображения кнопки редактирования своего профиля/отписки или подписки на другого юзера
@@ -22,9 +25,12 @@ function UptadeProfileButton({ data }) {
     const { userId } = useParams()
     const dispatch = useDispatch()
 
+    // отслеживание нажатия кнопки редактирования профиля
+    const [isEditProfile, setIsEditProfile] = useContext(EditProfile)
+
     // контекст обновления профиля
     const [updateProfile, setUpdateProfile] = useContext(UpdateProfile)
-    console.log('updateProfile: ', updateProfile)
+    // console.log('updateProfile: ', updateProfile)
 
     // определяем мой id
     const myId = updateProfile?._id
@@ -36,7 +42,7 @@ function UptadeProfileButton({ data }) {
     const isFollowing = myFollowingList && (myFollowingList)?.some(item => item === (data?.owner?._id || data?._id))
 
 
-    // функция подписки/отписки
+    // функция подписки/отписки - это чисто кнопка
     function isSubscribing() {
 
         // при клике на посте
@@ -55,80 +61,117 @@ function UptadeProfileButton({ data }) {
 
     // функция перехода на редактирование профиля
     function upsertProfile() {
-        history.push('/updateprofile')
+        // history.push('/updateprofile')
+        setIsEditProfile(true)
     }
 
 
     return (
-        <React.Fragment>
-            {userId === myId && <Box
-                onClick={upsertProfile}
-            >
-                <Button
-                    size="large"
-                    variant="elevated"
-                    sx={{
-                        minWidth: '300px'
-                    }}
-                    startIcon={
-                        <ManageAccountsRounded />
-                    }
-                    disableRipple
-                >
-                    <Typography
-                        variant='button'
-                        display='block'
-                    >
-                        Редактировать аккаунт
-                    </Typography>
-                </Button>
-            </Box>}
-            {myFollowingList?.includes(userId) && <Box
-                onClick={isSubscribing}
+        // <React.Fragment>
+        //     {userId === myId && <Box
+        //         onClick={upsertProfile}
+        //     >
+        //         <Button
+        //             size="large"
+        //             variant="elevated"
+        //             sx={{
+        //                 minWidth: '300px'
+        //             }}
+        //             startIcon={
+        //                 <ManageAccountsRounded />
+        //             }
+        //             disableRipple
+        //         >
+        //             <Typography
+        //                 variant='button'
+        //                 display='block'
+        //             >
+        //                 Редактировать аккаунт
+        //             </Typography>
+        //         </Button>
+        //     </Box>}
+        //     {myFollowingList?.includes(userId) && <Box
+        //         onClick={isSubscribing}
+        //     >
+        //         <Button
+        //             size="large"
+        //             variant="elevated"
+        //             sx={{
+        //                 minWidth: '300px'
+        //             }}
+        //             startIcon={
+        //                 <PersonRemoveRounded />
+        //             }
+        //             disableRipple
+        //         >
+        //             <Typography
+        //                 variant='button'
+        //                 display='block'
+        //             >
+        //                 Отписаться
+        //             </Typography>
+        //         </Button>
+        //     </Box>}
+        //     {(userId !== myId && !myFollowingList?.includes(userId)) && <Box
+        //         onClick={isSubscribing}
+        //     >
+        //         <Button
+        //             size="large"
+        //             variant="filledTonal"
+        //             sx={{
+        //                 minWidth: '300px'
+        //             }}
+        //             startIcon={
+        //                 <PersonAddRounded />
+        //             }
+        //             disableRipple
+        //         >
+        //             <Typography
+        //                 variant='button'
+        //                 display='block'
+        //             >
+        //                 Подписаться
+        //             </Typography>
+        //         </Button>
+        //     </Box>}
+        // </React.Fragment>
+
+
+        <Box
+            onClick={
+                (userId === myId && upsertProfile) ||
+                (myFollowingList?.includes(userId) && isSubscribing) ||
+                ((userId !== myId && !myFollowingList?.includes(userId)) && isSubscribing)}
+        >
+            <Button
+                size="large"
+                // variant="elevated"
+                variant={
+                    ((userId === myId) && 'elevated') ||
+                    ((myFollowingList?.includes(userId)) && 'elevated') ||
+                    ((userId !== myId && !myFollowingList?.includes(userId)) && 'filledTonal')
+                }
+                sx={{
+                    minWidth: '300px'
+                }}
+                startIcon={
+                    ((userId === myId) && <ManageAccountsRounded />) ||
+                    ((myFollowingList?.includes(userId)) && <PersonRemoveRounded />) ||
+                    ((userId !== myId && !myFollowingList?.includes(userId)) && <PersonAddRounded />)
+                }
+                disableRipple
             >
-                <Button
-                    size="large"
-                    variant="elevated"
-                    sx={{
-                        minWidth: '300px'
-                    }}
-                    startIcon={
-                        <PersonRemoveRounded />
-                    }
-                    disableRipple
+                <Typography
+                    variant='button'
+                    display='block'
                 >
-                    <Typography
-                        variant='button'
-                        display='block'
-                    >
-                        Отписаться
-                    </Typography>
-                </Button>
-            </Box>}
-            {(userId !== myId && !myFollowingList?.includes(userId)) && <Box
-                onClick={isSubscribing}
-            >
-                <Button
-                    size="large"
-                    variant="filledTonal"
-                    sx={{
-                        minWidth: '300px'
-                    }}
-                    startIcon={
-                        <PersonAddRounded />
+                    {(userId === myId) && 'Редактировать аккаунт' ||
+                        (myFollowingList?.includes(userId)) && 'Отписаться' ||
+                        (userId !== myId && !myFollowingList?.includes(userId)) && 'Подписаться'
                     }
-                    disableRipple
-                >
-                    <Typography
-                        variant='button'
-                        display='block'
-                    >
-                        Подписаться
-                    </Typography>
-                </Button>
-            </Box>}
-        </React.Fragment>
-
+                </Typography>
+            </Button>
+        </Box>
     )
 }
 
@@ -141,9 +184,25 @@ export default function BasicCard({ userData }) {
     // определяем количество постов пользоваеля
     const userPostsCount = useSelector(state => state?.promise?.UserPostsCount?.payload)
 
+    // контекст обновления профиля
+    const [updateProfile, setUpdateProfile] = useContext(UpdateProfile)
+    // console.log('updateProfile: ', updateProfile)
+
+    // отслеживание нажатия кнопки редактирования профиля
+    const [isEditProfile, setIsEditProfile] = useContext(EditProfile)
+
     // контекст модального окна
     const [modalName, setModalName, modalArray, setModalArray, openModal, setOpenModal, handleOpenModal, handleCloseModal] = useContext(ModalForCountsContext)
 
+    // отслеживание статуса изменения пароля
+    const [changePassword, setChangePassword] = useState(false)
+
+    // открытие поля редактирвоания пароля
+    function changePasswordButton() {
+        setChangePassword(true)
+    }
+
+
     function userFollowers() {
         handleOpenModal({
             arr: userData?.followers, name: `Подписчики ${userData?.login}`
@@ -163,85 +222,269 @@ export default function BasicCard({ userData }) {
             alignItems: 'center'
         }}
         >
-            <Avatar
+            {/* <Avatar
                 alt={userData?.login}
                 src={url + userData?.avatar?.url}
                 sx={{
                     width: 130,
                     height: 130
                 }}
-            />
+            // children={
+            //     <BorderColorRounded />
+            // }
+            >
+                <BorderColorRounded sx={{
+                    color: 'black',
+                    zIndex: 999
+                }} />
+            </Avatar> */}
+
+
+
 
             <Box
                 sx={{
-                    display: 'flex',
-                    flexDirection: 'column',
-                    marginLeft: '50px '
-                }}
-            >
-                <CardContent sx={{
-                    flex: '1 0 auto'
-                }}
-                >
-                    <Stack
+                    position: 'relative',
+                    display: 'inline-block'
+                }}>
+                <Avatar
+                    alt={userData?.login}
+                    src={url + userData?.avatar?.url}
+                    sx={{
+                        width: 130,
+                        height: 130
+                    }}
+                />
+                {isEditProfile &&
+                    <Box
                         sx={{
-                            justifyContent: 'space-between'
+                            position: 'absolute',
+                            top: 0,
+                            left: 0,
+                            width: '100%',
+                            height: '100%',
+                            display: 'flex',
+                            justifyContent: 'center',
+                            alignItems: 'center',
+                            zIndex: 1,
+                            '&:before': {
+                                content: '""',
+                                position: 'absolute',
+                                top: 0,
+                                left: 0,
+                                width: '100%',
+                                height: '100%',
+                                backgroundColor: 'rgba(0,0,0,0.5)',
+                                zIndex: -1,
+                                borderRadius: '50%',
+                            }
                         }}
-                        direction="row"
-                        spacing={2}
                     >
+                        <ImageSearchRounded
+                            sx={{
+                                color: '#FFF',
+                                fontSize: '40px'
+                            }}
+                        />
+                    </Box>}
+            </Box>
+
+
+
+            {!isEditProfile &&
+                <Box
+                    sx={{
+                        display: 'flex',
+                        flexDirection: 'column',
+                        marginLeft: '50px '
+                    }}
+                >
+                    <CardContent sx={{
+                        flex: '1 0 auto'
+                    }}
+                    >
+                        <Stack
+                            sx={{
+                                justifyContent: 'space-between'
+                            }}
+                            direction="row"
+                            spacing={2}
+                        >
+                            <Typography
+                                component="div"
+                                variant="h4"
+                            >
+                                {userData?.login}
+                            </Typography>
+
+                            <UptadeProfileButton data={userData} />
+                        </Stack>
+
                         <Typography
+                            variant="subtitle1"
+                            color="text.secondary"
                             component="div"
-                            variant="h4"
                         >
-                            {userData?.login}
+                            {userData?.nick || ''}
                         </Typography>
+                    </CardContent>
 
-                        <UptadeProfileButton data={userData} />
-                    </Stack>
-
-                    <Typography
-                        variant="subtitle1"
-                        color="text.secondary"
-                        component="div"
-                    >
-                        {userData?.nick || ''}
-                    </Typography>
-                </CardContent>
-
-                <Stack
-                    direction="row"
-                    spacing={5}
-                    padding={2}
-                    paddingTop={1}
-                >
-                    <Typography
-                        variant="subtitle1"
+                    <Stack
+                        direction="row"
+                        spacing={5}
+                        padding={2}
+                        paddingTop={1}
                     >
-                        {userPostsCount || '0'} публикаций
-                    </Typography>
+                        <Typography
+                            variant="subtitle1"
+                        >
+                            {userPostsCount || '0'} публикаций
+                        </Typography>
 
-                    <Typography
-                        sx={{
-                            cursor: 'pointer'
-                        }}
-                        variant="subtitle1"
-                        onClick={userFollowers}
-                    >
-                        {userData?.followers?.length || '0'} подписчиков
-                    </Typography>
+                        <Typography
+                            sx={{
+                                cursor: 'pointer'
+                            }}
+                            variant="subtitle1"
+                            onClick={userFollowers}
+                        >
+                            {userData?.followers?.length || '0'} подписчиков
+                        </Typography>
 
-                    <Typography
-                        sx={{
-                            cursor: 'pointer'
-                        }}
-                        variant="subtitle1"
-                        onClick={userFollowing}
-                    >
-                        {userData?.following?.length || '0'} подписок
-                    </Typography>
-                </Stack>
-            </Box>
+                        <Typography
+                            sx={{
+                                cursor: 'pointer'
+                            }}
+                            variant="subtitle1"
+                            onClick={userFollowing}
+                        >
+                            {userData?.following?.length || '0'} подписок
+                        </Typography>
+                    </Stack>
+                </Box>}
+
+            {isEditProfile && <ChangeData />
+                // <Box
+                //     sx={{
+                //         display: 'flex',
+                //         flexDirection: 'column',
+                //         marginLeft: '50px '
+                //     }}
+                // >
+                //     {/* <CardContent sx={{
+                //         flex: '1 0 auto'
+                //     }}
+                //     > */}
+                //     <Stack
+                //         sx={{
+                //             justifyContent: 'space-between',
+                //             marginBottom: '10px'
+                //         }}
+                //         direction="row"
+                //         spacing={2}
+                //     >
+                //         <Box
+                //             sx={{
+                //                 display: 'flex',
+                //                 alignItems: 'flex-end'
+                //             }}>
+                //             <AccountCircle
+                //                 sx={{
+                //                     color: 'action.active',
+                //                     mr: 1, my: 0.5
+                //                 }} />
+                //             <TextField
+                //                 id="input-new-login"
+                //                 label="Новый логин"
+                //                 variant="standard" />
+                //         </Box>
+
+                //         <Box
+                //             sx={{
+                //                 display: 'flex',
+                //                 alignItems: 'flex-end'
+                //             }}>
+                //             <AccountCircle
+                //                 sx={{
+                //                     color: 'action.active',
+                //                     mr: 1, my: 0.5
+                //                 }} />
+                //             <TextField
+                //                 id="input-new-nick"
+                //                 label="Новый ник-нейм"
+                //                 variant="standard" />
+                //         </Box>
+                //     </Stack>
+
+                //     <Stack
+                //         sx={{
+                //             justifyContent: 'space-between',
+                //             marginBottom: '10px'
+                //         }}
+                //         direction="row"
+                //         spacing={2}
+                //     >
+                //         <Box
+                //             onClick={changePasswordButton}
+                //         >
+                //             <Button
+                //                 sx={{
+                //                     padding: '5px 20px'
+                //                 }}
+                //                 size="small"
+                //                 variant="text"
+                //             >
+                //                 Редактировать пароль
+                //             </Button>
+                //         </Box>
+
+                //         {changePassword &&
+                //             <React.Fragment>
+                //                 <Box
+                //                     sx={{
+                //                         display: 'flex',
+                //                         alignItems: 'flex-end'
+                //                     }}>
+                //                     <HttpsRounded
+                //                         sx={{
+                //                             color: 'action.active',
+                //                             mr: 1, my: 0.5
+                //                         }} />
+                //                     <TextField
+                //                         id="input-new-login"
+                //                         label="Старый пароль"
+                //                         variant="standard" />
+                //                 </Box>
+
+                //                 <Box
+                //                     sx={{
+                //                         display: 'flex',
+                //                         alignItems: 'flex-end'
+                //                     }}>
+                //                     <HttpsRounded
+                //                         sx={{
+                //                             color: 'action.active',
+                //                             mr: 1, my: 0.5
+                //                         }} />
+                //                     <TextField
+                //                         id="input-new-nick"
+                //                         label="Новый пароль"
+                //                         variant="standard" />
+                //                 </Box>
+                //             </React.Fragment>}
+                //     </Stack>
+
+                //     <Button
+                //         size="medium"
+                //         variant="filledTonal"
+                //         sx={{
+                //             maxWidth: '300px'
+                //         }}
+                //     >
+                //         Сохранить изменения
+                //     </Button>
+                // </Box>
+            }
 
             {modalArray && <ModalWindow />}
         </Container>

+ 1 - 1
js/Project/project/src/redux/action.js

@@ -52,7 +52,7 @@ export const actionPromise = (type, nameOfPromise, promise) =>
     }
   }
 
-
+// ================================================================================================== 
 
 
 // акшон для логинизации в authReduser

+ 41 - 5
js/Project/project/src/redux/thunks.js

@@ -20,7 +20,8 @@ import {
     actionUpdateProfile,
     actionSearchUser,
     actionSearchPost,
-    actionSearchComment
+    actionSearchComment,
+    actionPassChange
 } from "./action"
 
 
@@ -70,13 +71,31 @@ export const actionFullLogout = () =>
 
 
 
+
+
+// запрос на изменение пароля
+export const actionFullPassChange = (login, oldPass, newPass) =>
+    async dispatch => {
+        console.log(login, oldPass, newPass)
+
+        const result = await dispatch(actionPassChange(login, oldPass, newPass))
+
+        return result
+    }
+
+
+
+
+
 // Запрос юзера (данные о пользователе + количество его постов + все его посты(100 шт))
 export const actionFullUserFindOne = _id =>
     dispatch => {
+        console.log('[_id]: ', [_id])
         const requestsAboutUser = [
             actionFindUserOne(_id, 'UserFindOne'),
             actionPostsCount(_id, 'UserPostsCount'),
-            actionFeedFindOne([_id], -1, 100, 'UserFeed')
+            actionFeedFindOne([_id], -1, 22, 'UserFeed'),
+            actionFeedFindOne([], -1, 15, 'AddUserFeed')
         ]
 
         return Promise.all(requestsAboutUser?.map(item => dispatch(item)))
@@ -149,12 +168,12 @@ export const actionAboutMe = () =>
 // ================= на удаление (начало)=====================
 
 
-// Запрос на догрузку ленты постов
+// Запрос на догрузку ленты моих постов
 export const actionDownloadFeed = () =>
     async (dispatch, getState) => {
-        console.log('касание')
+        // console.log('касание')
 
-        const followingList = (getState()?.promise?.AboutMe?.payload?.following)?.map(user => user._id)
+        const followingList = (getState()?.promise?.AboutMe?.payload?.following)?.map(user => user?._id)
 
         const myFeed = (getState()?.feed?.MyFeed?.payload)
 
@@ -168,6 +187,23 @@ export const actionDownloadFeed = () =>
 
 
 
+// Запрос на догрузку ленты постов юзера
+export const actionDownloadUserFeed = () =>
+    async (dispatch, getState) => {
+        console.log('касание')
+
+        const userId = getState()?.promise?.UserFindOne?.payload?._id
+        console.log('[userId]: ', [userId])
+
+        const userFeed = (getState()?.feed?.UserFeed?.payload)
+        console.log('userFeed: ', userFeed)
+
+        const result = await dispatch(actionFeedFindOne([userId], -1, 15, 'AddUserFeed', userFeed?.length))
+
+        return result
+    }
+
+