App.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. import './App.scss'
  2. import { Provider, connect } from 'react-redux'
  3. import { Router, Route, Link, Redirect, Switch } from 'react-router-dom'
  4. import createHistory from 'history/createBrowserHistory'
  5. import React, { useMemo, useState, useEffect } from 'react'
  6. import { store } from './reducers'
  7. import { Basic } from './components/DropZone'
  8. import {CPageAboutUser,PageAboutUser} from './components/User'
  9. import { PageCreatePost,AddPost } from './components/NewPost'
  10. import {CPost,MyCarousel } from './components/Post'
  11. import { sortableContainer, sortableElement } from 'react-sortable-hoc'
  12. import { arrayMove, arrayMoveImmutable, arrayMoveMutable } from 'array-move'
  13. import 'antd/dist/antd.css'
  14. import {
  15. // backendURL,
  16. actionAboutMe,
  17. actionSetAvatar,
  18. actionPostsFeed,
  19. actionAllFollowing,
  20. actionAllFollowers,
  21. actionPostsMyFollowing2,
  22. actionSearchUser
  23. } from './actions'
  24. import { Upload, Button, DatePicker, Space } from 'antd'
  25. import moment from 'moment'
  26. import { UploadOutlined,SearchOutlined } from '@ant-design/icons'
  27. import ImgCrop from 'antd-img-crop'
  28. import { Avatar, Image, Divider, Radio } from 'antd'
  29. import { UserOutlined } from '@ant-design/icons'
  30. import user from './materials/user.png'
  31. import photoNotFound from './materials/photoNotFound.png'
  32. // import "react-responsive-carousel/lib/styles/carousel.min.css"; // requires a loader
  33. // import { Carousel } from 'react-responsive-carousel';
  34. import { Carousel,Popover } from 'antd'
  35. import { LeftCircleFilled, RightCircleFilled } from '@ant-design/icons'
  36. import { Input,Select } from 'antd';
  37. import {PagePost} from './components/Post'
  38. console.log(store.getState())
  39. store.subscribe(() => console.log(store.getState()))
  40. //
  41. console.log('ABOUT ME',store.getState().auth?.payload?.sub?.id);
  42. // console.log('ABOUT FOLLOWING',store.getState().promise.aboutUser?.payload?.following);
  43. //store.dispatch(actionPostsFeed())
  44. const PageMain = () => <div className="PageMain">ГЛАВНАЯ</div>
  45. const MyPostFeed =({postsFeed, onPostsFeed})=>{
  46. useEffect(() => {
  47. onPostsFeed()
  48. }, [])
  49. return <>
  50. <h2>Feed</h2>
  51. <div>
  52. {
  53. // backendURL +
  54. (postsFeed||[]).map(({images, title,text,owner})=>(
  55. <div style={{borderWidth:'10',
  56. borderColor: '#000',
  57. borderStyle: 'solid',
  58. marginBottom: '40px', }}>
  59. {owner?.avatar ? (
  60. <Avatar
  61. style={{ width: '50px', height: '50px' }}
  62. src={ '/' + owner?.avatar?.url}
  63. />
  64. ) : (
  65. <Avatar style={{ width: '50px', height: '50px' }} src={user} />
  66. )}
  67. <h1> {owner?.login || 'anon'}</h1>
  68. <MyCarousel images={images} style={{ marginTop: '60px'}} />
  69. <h1> Title: {title || ''}</h1>
  70. <h1> Text: {text || ''}</h1>
  71. </div>
  72. )
  73. )
  74. }
  75. </div>
  76. {/* </div> */}
  77. {/* <PagePost onePost={postsFeed}/> <MyCarousel images={postsFeed?.images} />*/}
  78. </>
  79. }
  80. export const CPostForFeed = connect((state) => ({
  81. postsFeed: state.promise?.postsFeed?.payload,
  82. }), {onPostsFeed:actionPostsFeed})(MyPostFeed)
  83. // const PageFeed = ({ aboutMe,allFollowing, onPostsFeed, onAllFollowing}) => {
  84. // console.log('ABOUT FOLLOWING',
  85. // store.getState().promise.aboutMe?.payload?.following);
  86. // useEffect(() => {
  87. // onPostsFeed()
  88. // }, [])
  89. // return <>
  90. // <div style={{background: '#FFFACD' }}>
  91. // <h2>Feed</h2>
  92. // </div>
  93. // </>
  94. // }
  95. // const CPageFeed =connect((state)=>(
  96. // {
  97. // aboutMe: state.promise.aboutMe?.payload ,
  98. // // allPosts: state.promise?.allPosts?.payload,
  99. // postsFeed: state.promise?.postsFeed?.payload,
  100. // }), {onPostsFeed:actionPostsFeed})(PageFeed)
  101. const Main = () => (
  102. <main>
  103. <Switch>
  104. <Route path="/" exact component={PageMain} />
  105. <Route path="/profile/:_id" component={CPageAboutUser} />
  106. <Route path="/edit/post" component={PageCreatePost} />
  107. <Route path="/post/:_id" component={CPost} />
  108. <Route path="/feed" component={CPostForFeed} />
  109. <Route path="/editProfile" component={CUserEdit} />
  110. {/* <CBasic /> */}
  111. </Switch>
  112. </main>
  113. )
  114. const ResultUserFind =({userFind})=>
  115. <div>
  116. {userFind?.map(({_id, login, avatar})=>(
  117. <Link to={`/profile/${_id}`} >
  118. <Avatar
  119. style={{ width: '20px', height: '20px',marginRight:'30px', position: 'absolute' }}
  120. src={ '/' + avatar?.url || user}
  121. />
  122. <h3 style={{ marginLeft:'30px'}} > {login}</h3>
  123. </Link>
  124. ))}
  125. </div>
  126. // backendURL
  127. const SearchUser =({onSearch,searchUser})=>{
  128. // const [value, setValue]=useState('')
  129. const onSearchUser = value => onSearch(value)
  130. const { Search } = Input;
  131. return <>
  132. <Popover placement="bottom" content={<ResultUserFind userFind={searchUser}/>} trigger="click">
  133. <Search
  134. placeholder="input search text"
  135. allowClear
  136. enterButton="Search"
  137. size="large"
  138. onSearch={onSearchUser}
  139. />
  140. </Popover>
  141. </>
  142. }
  143. const CSearch = connect((state)=>({searchUser:state.promise?.searchUser?.payload}),
  144. {onSearch:actionSearchUser})(SearchUser)
  145. const CUserEdit = connect((state)=>({}),
  146. {}
  147. )(PageAboutUser)
  148. const Feed = ({aboutMe,onAllFollowing, onPostsFeed, postsFeed}) => {
  149. console.log('POST FEED', postsFeed)
  150. return <>
  151. <Link className="Feed" to={`/feed`}>
  152. <Button className="Feed" size="large" onClick={()=>console.log('click')}> Feed </Button>
  153. </Link>
  154. </>}
  155. const Header = () => {
  156. const CFeed =connect((state) => ({aboutMe: state.promise?.aboutMe?.payload}))(Feed)
  157. return <section className="Header">
  158. <CSearch/>
  159. {/* <Button icon={<SearchOutlined />}>Search</Button> */}
  160. <CFeed/>
  161. <AddPost />
  162. <Recommendations />
  163. <Likes />
  164. <CUser />
  165. </section>
  166. }
  167. const Likes = () => <Button size="large" className="Likes"> Likes </Button>
  168. const Recommendations = () => (
  169. <Button size="large" className="Recomendations"> Recommendations </Button>
  170. )
  171. const CBasic = connect(null, { onLoad: actionSetAvatar })(Basic)
  172. // const CAddPost =connect(null,{actionPostUpsert})
  173. const User = ({ aboutMe: { _id, login, avatar } = {} }) => (
  174. <Link className="User" to={`/profile/${_id}`}>
  175. <Avatar src={ '/' + avatar?.url || user} />
  176. </Link>
  177. )
  178. // backendURL
  179. const CUser = connect((state) => ({ aboutMe: state.promise.aboutMe?.payload }))(
  180. User
  181. )
  182. // store.getState().auth?.payload?.sub?.id
  183. const ProtectedRoute = ({roles=[], fallback='/login', component, auth, ...routeProps})=>{
  184. console.log('LFLFLFL')
  185. const WrapperComponent = (renderProps)=>{
  186. // console.log('тут шото ', intersection)
  187. const C = component;
  188. if (!auth)
  189. auth=["anon"]
  190. let intersection = auth.filter(x => roles.includes(x));
  191. if (intersection.length==0)
  192. return <Redirect to={fallback} />
  193. return <C {...renderProps}/>
  194. }
  195. return <Route {...routeProps} component ={WrapperComponent}/>
  196. }
  197. const PageRegister = ()=>{
  198. return <div>
  199. REGISTER
  200. </div>}
  201. const CProtectedRoute = connect(state=>({auth:state.auth?.payload?.sub.acl}))(ProtectedRoute);
  202. const history = createHistory()
  203. function App() {
  204. if (store.getState().auth?.token)
  205. store.dispatch(actionAboutMe(store.getState().auth?.payload?.sub?.id))
  206. return (
  207. <Router history={history}>
  208. <Provider store={store}>
  209. <div className="App">
  210. <Header />
  211. <Divider />
  212. <Main />
  213. <CProtectedRoute roles={["anon"]} fallback="/dashboard"
  214. path="/register" component={PageRegister}/>
  215. {/* <CPostEditor /> */}
  216. {/* <CPost /> */}
  217. {/* <Gallery/> */}
  218. </div>
  219. </Provider>
  220. </Router>
  221. )
  222. }
  223. export default App