mirror of
https://github.com/more-tech4-magnum-opus/frontend.git
synced 2024-11-22 00:26:35 +03:00
add marketplace
This commit is contained in:
parent
86477bd461
commit
dcd43fa9de
|
@ -1,23 +1,18 @@
|
||||||
import React, { useState } from "react"
|
import React, { useState } from "react"
|
||||||
import { getProducts, getUser } from "../../app/admin/adminSlice";
|
import { addProduct, addProducts, fetchAddProduct, getProducts, getUser } from "../../app/admin/adminSlice";
|
||||||
import { RootAdminState } from "../../app/adminStore";
|
import { RootAdminState } from "../../app/adminStore";
|
||||||
import { useAppSelector } from "../../app/hooks";
|
import { adminFetcher, useAppDispatch, useAppSelector } from "../../app/hooks";
|
||||||
import { Header } from "../../components/Header";
|
import { Header } from "../../components/Header";
|
||||||
import { AdminMarketCard } from "../adminMarketCard";
|
import { AdminMarketCard } from "../adminMarketCard";
|
||||||
import "./adminMarket.css"
|
import "./adminMarket.css"
|
||||||
import {
|
import { ProductIE } from "../../app/interfaces";
|
||||||
BrowserRouter as Router,
|
|
||||||
Route,
|
|
||||||
Routes,
|
|
||||||
Link
|
|
||||||
} from "react-router-dom";
|
|
||||||
import { AdminMarketPopUp } from "../adminMarketPopUp";
|
|
||||||
|
|
||||||
export const AdminMarket:React.FC = () =>{
|
export const AdminMarket:React.FC = () =>{
|
||||||
const [opened, setOpened] = useState(false);
|
const [first, setFirst] = useState(true)
|
||||||
|
|
||||||
let user = useAppSelector((state:RootAdminState)=>getUser(state))
|
let user = useAppSelector((state:RootAdminState)=>getUser(state))
|
||||||
let cards: JSX.Element[] = []
|
let cards: JSX.Element[] = []
|
||||||
let products = useAppSelector(
|
let prod = useAppSelector(
|
||||||
(state: RootAdminState)=>getProducts(state)).forEach(
|
(state: RootAdminState)=>getProducts(state)).forEach(
|
||||||
product=>cards.push(<AdminMarketCard
|
product=>cards.push(<AdminMarketCard
|
||||||
name={product.name}
|
name={product.name}
|
||||||
|
@ -26,6 +21,29 @@ export const AdminMarket:React.FC = () =>{
|
||||||
cost={product.cost}
|
cost={product.cost}
|
||||||
id={product.id}
|
id={product.id}
|
||||||
></AdminMarketCard>))
|
></AdminMarketCard>))
|
||||||
|
let products = useAppSelector((state:RootAdminState)=>getProducts(state))
|
||||||
|
|
||||||
|
let dispatch = useAppDispatch()
|
||||||
|
|
||||||
|
if (products.length == 0 && first ){
|
||||||
|
setFirst(false)
|
||||||
|
adminFetcher.get("marketplace/product/").then(
|
||||||
|
(response)=>{
|
||||||
|
dispatch(addProducts(
|
||||||
|
response.data.map((params:any)=>
|
||||||
|
({
|
||||||
|
name: params.name,
|
||||||
|
description:params.description,
|
||||||
|
image: params.image_cropped,
|
||||||
|
cost:Number(params.price),
|
||||||
|
id:params.slug
|
||||||
|
} as ProductIE)
|
||||||
|
)
|
||||||
|
))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return(
|
return(
|
||||||
<div className="market">
|
<div className="market">
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
.adminCard{
|
.adminCard{
|
||||||
width: 240px;
|
width: 240px;
|
||||||
max-height: 400px;
|
max-height: 450px;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
background: #FFFFFF;
|
background: #FFFFFF;
|
||||||
|
@ -37,7 +37,7 @@
|
||||||
.adminCardH2{
|
.adminCardH2{
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 24px;
|
line-height: 18px;
|
||||||
color: rgba(0, 0, 0, 0.85)
|
color: rgba(0, 0, 0, 0.85)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,15 +14,18 @@ export const AdminMarketCard:React.FC<ProductIE> = (props) =>{
|
||||||
|
|
||||||
return(
|
return(
|
||||||
<div className="adminCard">
|
<div className="adminCard">
|
||||||
<img src={props.image}></img>
|
<img className="adminImg" src={props.image}></img>
|
||||||
|
<div className="adminCardWrapper">
|
||||||
<div className="adminCost">
|
<div className="adminCost">
|
||||||
<img src="/rub.svg"></img>
|
<img src="/rub.svg"></img>
|
||||||
<div>{props.cost}</div>
|
<div>{props.cost}</div>
|
||||||
</div>
|
</div>
|
||||||
<div>{props.name}</div>
|
<div className="adminCardH2">{props.name}</div>
|
||||||
<div>{props.description}</div>
|
<div className="adminCardDescr">{props.description.split(" ").slice(0,6).join(" ")}</div>
|
||||||
<Button className="btn1" onClick={()=>navigate("/admin/market/" + props.id) }>Редактировать</Button>
|
<Button className="btn1" style={{width:"100%"}} onClick={()=>navigate("/admin/market/" + props.id) }>Редактировать</Button>
|
||||||
<Button className="btn2" onClick={()=>fetchDelProduct(dispatch, props.id)}>Удалить</Button>
|
<Button className="btn2" style={{width:"100%"}} onClick={()=>fetchDelProduct(dispatch, props.id)}>Удалить</Button>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
|
@ -11,7 +11,7 @@ import { Header } from "../../components/Header"
|
||||||
|
|
||||||
export const AdminMarketPopUp:React.FC = () =>{
|
export const AdminMarketPopUp:React.FC = () =>{
|
||||||
let {id} = useParams()
|
let {id} = useParams()
|
||||||
let product = useAppSelector((state: RootAdminState)=>getProductByID(state, Number(id)))
|
let product = useAppSelector((state: RootAdminState)=>getProductByID(state, id as string))
|
||||||
const [cost, setCost] = useState(product.cost)
|
const [cost, setCost] = useState(product.cost)
|
||||||
const [name, setName] = useState(product.name)
|
const [name, setName] = useState(product.name)
|
||||||
const [descr, setDescr] = useState(product.description)
|
const [descr, setDescr] = useState(product.description)
|
||||||
|
@ -20,14 +20,12 @@ export const AdminMarketPopUp:React.FC = () =>{
|
||||||
let dispatch = useAppDispatch()
|
let dispatch = useAppDispatch()
|
||||||
let navigate = useNavigate()
|
let navigate = useNavigate()
|
||||||
const onSave = () =>{
|
const onSave = () =>{
|
||||||
console.log("cocb")
|
|
||||||
fetchChangeProduct(dispatch, {
|
fetchChangeProduct(dispatch, {
|
||||||
cost: cost,
|
cost: cost,
|
||||||
name: name,
|
name: name,
|
||||||
description: descr,
|
descr: descr,
|
||||||
id:product.id,
|
id: product.id
|
||||||
image: product.image
|
})
|
||||||
} as ProductIE)
|
|
||||||
navigate("/admin/market")
|
navigate("/admin/market")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,21 +8,8 @@ import { RootAdminState } from "../app/adminStore";
|
||||||
import { Header } from "../components/Header";
|
import { Header } from "../components/Header";
|
||||||
|
|
||||||
export const AdminPage:React.FC = () => {
|
export const AdminPage:React.FC = () => {
|
||||||
const [respProducts, setRespProducts] = useState([-1 as any])
|
|
||||||
let products = useAppSelector((state:RootAdminState)=>getProducts(state))
|
|
||||||
let user = useAppSelector((state:RootAdminState)=>getUser(state))
|
|
||||||
let dispatch = useAppDispatch()
|
|
||||||
if (products.length == 0){
|
|
||||||
adminFetcher.get("marketplace/product/").then(
|
|
||||||
(response)=> setRespProducts(response.data as any)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (respProducts[0] != -1){
|
let user = useAppSelector((state:RootAdminState)=>getUser(state))
|
||||||
respProducts.forEach((product)=>{
|
|
||||||
fetchAddProduct(dispatch, product)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return(
|
return(
|
||||||
|
|
|
@ -32,9 +32,16 @@ const adminSlice = createSlice(
|
||||||
state.user.balance = state.user.balance - action.payload
|
state.user.balance = state.user.balance - action.payload
|
||||||
},
|
},
|
||||||
addProduct(state, action: PayloadAction<ProductIE>){
|
addProduct(state, action: PayloadAction<ProductIE>){
|
||||||
|
if(state.market.products.indexOf(action.payload) == -1){
|
||||||
state.market.products = state.market.products.concat([action.payload])
|
state.market.products = state.market.products.concat([action.payload])
|
||||||
|
}
|
||||||
},
|
},
|
||||||
delProduct(state, action:PayloadAction<number>){
|
addProducts(state, action: PayloadAction<ProductIE[]>){
|
||||||
|
if(state.market.products.length == 0){
|
||||||
|
state.market.products = state.market.products.concat(action.payload)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
delProduct(state, action:PayloadAction<string>){
|
||||||
let products = state.market.products
|
let products = state.market.products
|
||||||
let ind = 0
|
let ind = 0
|
||||||
products.forEach((product, index)=>{
|
products.forEach((product, index)=>{
|
||||||
|
@ -47,6 +54,7 @@ const adminSlice = createSlice(
|
||||||
},
|
},
|
||||||
changeProduct(state, action:PayloadAction<ProductIE>){
|
changeProduct(state, action:PayloadAction<ProductIE>){
|
||||||
let products = state.market.products
|
let products = state.market.products
|
||||||
|
console.log(action.payload)
|
||||||
products.forEach((product,index)=>{
|
products.forEach((product,index)=>{
|
||||||
if (product.id == action.payload.id){
|
if (product.id == action.payload.id){
|
||||||
products[index] = action.payload
|
products[index] = action.payload
|
||||||
|
@ -64,29 +72,50 @@ export async function fetchSendCoins(dispatch:AppAdminDispatch, params:{userID:n
|
||||||
dispatch(sendCoins(params.amount))
|
dispatch(sendCoins(params.amount))
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function fetchAddProduct(dispatch:AppAdminDispatch, params:{image: FormData, descr: string, name:string, cost:number}) {
|
export async function fetchAddProduct(dispatch:AppAdminDispatch, params:{image: File, descr: string, name:string, cost:number}) {
|
||||||
//тут идет фетч
|
//тут идет фетч
|
||||||
let data = {
|
const formData = new FormData()
|
||||||
image: "",
|
formData.append("name",params.name)
|
||||||
description: params.descr,
|
formData.append("description",params.descr)
|
||||||
name: params.name,
|
formData.append("image", params.image)
|
||||||
cost: params.cost,
|
formData.append("price",params.cost.toString())
|
||||||
id: params.cost
|
adminFetcher.post("marketplace/product/", formData).then((response)=>{
|
||||||
} as ProductIE //vмоковая даата
|
dispatch(addProduct({
|
||||||
adminFetcher.post("marketplace/product/", {
|
name: response.data.name,
|
||||||
|
description:response.data.description,
|
||||||
|
image: response.data.image_cropped,
|
||||||
|
cost:Number(response.data.price),
|
||||||
|
id:response.data.slug
|
||||||
|
} as ProductIE))
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
dispatch(addProduct(data))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function fetchDelProduct(dispatch:AppAdminDispatch, id:number) {
|
export async function fetchDelProduct(dispatch:AppAdminDispatch, id:string) {
|
||||||
//тут идет фетч
|
//тут идет фетч
|
||||||
dispatch(delProduct(id))
|
adminFetcher.delete("marketplace/product/"+id).then(()=>dispatch(delProduct(id)))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function fetchChangeProduct(dispatch:AppAdminDispatch, params:ProductIE) {
|
export async function fetchChangeProduct(dispatch:AppAdminDispatch, params:{id:string, descr: string, name:string, cost:number}) {
|
||||||
dispatch(changeProduct(params))
|
const formData = new FormData()
|
||||||
|
formData.append("name",params.name)
|
||||||
|
formData.append("description",params.descr)
|
||||||
|
formData.append("price",params.cost.toString())
|
||||||
|
adminFetcher.patch("marketplace/product/" + params.id, formData).then((response)=>{
|
||||||
|
dispatch(delProduct(params.id))
|
||||||
|
dispatch(addProduct({
|
||||||
|
name: response.data.name,
|
||||||
|
description:response.data.description,
|
||||||
|
image: response.data.image_cropped,
|
||||||
|
cost:Number(response.data.price),
|
||||||
|
id:response.data.slug
|
||||||
|
} as ProductIE))
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getProducts = createSelector(
|
export const getProducts = createSelector(
|
||||||
|
@ -95,7 +124,7 @@ export const getProducts = createSelector(
|
||||||
)
|
)
|
||||||
|
|
||||||
export const getProductByID = createSelector(
|
export const getProductByID = createSelector(
|
||||||
(state:RootAdminState, id:number) => state.adminSlice.market.products.filter((product)=>product.id == id)[0],
|
(state:RootAdminState, id:string) => state.adminSlice.market.products.filter((product)=>product.id == id)[0],
|
||||||
(field)=>field
|
(field)=>field
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -113,6 +142,7 @@ export const {
|
||||||
addProduct,
|
addProduct,
|
||||||
delProduct,
|
delProduct,
|
||||||
changeProduct,
|
changeProduct,
|
||||||
|
addProducts
|
||||||
} = adminSlice.actions
|
} = adminSlice.actions
|
||||||
|
|
||||||
export default adminSlice.reducer
|
export default adminSlice.reducer
|
|
@ -42,7 +42,7 @@ export interface ProductIE{
|
||||||
description:string,
|
description:string,
|
||||||
image: string,
|
image: string,
|
||||||
cost: number,
|
cost: number,
|
||||||
id: number,
|
id: string,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum SortTypes{
|
export enum SortTypes{
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
|
|
||||||
color: #FFFFFF;
|
color: #FFFFFF;
|
||||||
|
z-index: 1000;
|
||||||
}
|
}
|
||||||
.links{
|
.links{
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
|
@ -12,27 +12,25 @@ export const FileUploader:React.FC<FileUploaderIE> = (data) =>{
|
||||||
|
|
||||||
const props = {
|
const props = {
|
||||||
name: 'file',
|
name: 'file',
|
||||||
action: host + '/api/',
|
action: "",
|
||||||
headers: {
|
headers: {
|
||||||
authorization: 'authorization-text',
|
authorization: 'authorization-text',
|
||||||
},
|
},
|
||||||
|
beforeUpload: (file:File) => {
|
||||||
onChange(info:any) {
|
const isPNG = file.type === 'image/png';
|
||||||
if (info.file.status !== 'uploading') {
|
if (!isPNG) {
|
||||||
|
message.error(`${file.name} is not a png file`);
|
||||||
}
|
}
|
||||||
|
data.onResponse(file)
|
||||||
|
return isPNG || Upload.LIST_IGNORE;
|
||||||
|
|
||||||
if (info.file.status === 'done') {
|
|
||||||
data.onResponse(info.file.response)
|
|
||||||
message.success(`${info.file.name} file uploaded successfully`);
|
|
||||||
} else if (info.file.status === 'error') {
|
|
||||||
message.error(`${info.file.name} file upload failed.`);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Upload {...props} multiple>
|
<Upload {...props}>
|
||||||
<Button icon={<UploadOutlined></UploadOutlined>}>Загрузите файлы для проверки</Button>
|
<Button icon={<UploadOutlined></UploadOutlined>}>Загрузите картинку</Button>
|
||||||
</Upload>
|
</Upload>
|
||||||
);
|
);
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user