From ce25d87c0b82d2792594fe788d6a2529fcc6fbbc Mon Sep 17 00:00:00 2001 From: Max Hunt Date: Sun, 17 May 2020 21:49:59 +0100 Subject: [PATCH] Update --- functions/index.js | 112 ++++++++++++++++++++-- functions/views/admin-review.ejs | 23 +++++ functions/views/css/style.css | 59 ++++++++++++ functions/views/js/fAuth.js | 2 +- functions/views/js/fAuth.src.js | 12 +++ functions/views/js/fdb.js | 2 +- functions/views/js/fdb.src.js | 142 +++++++++++++++++++++------- functions/views/partials/header.ejs | 5 + functions/views/user-profile.ejs | 3 +- server.js | 112 ++++++++++++++++++++-- 10 files changed, 419 insertions(+), 53 deletions(-) create mode 100644 functions/views/admin-review.ejs diff --git a/functions/index.js b/functions/index.js index 575b0b1..a73e4cf 100644 --- a/functions/index.js +++ b/functions/index.js @@ -77,6 +77,28 @@ app.get('/search', function(request, responce){ } }) +app.get('/admin-review', async function(request, responce){ + var dbRef = database.ref("/products") + if (request.query.authToken) { + let uid = await authCheck(request.query.authToken) + if (uid == "If84zSzRvlcCqRs0ZPJRpAcY1He2") { + dbRef.orderByChild("status").equalTo("pending").once('value', function(snapshot){ + if (snapshot.exists()) { + let products = snapshot.val() + responce.render('admin-review.ejs', {products: products}) + } else { + var products = {'x': {name: 'Nothing to review...',price: ''}} + responce.render('admin-review.ejs', {products: products}) + } + }) + } else { + responce.render('404.ejs') + } + } else { + responce.render('404.ejs') + } +}) + app.get('/additmpage', function(request, responce){ responce.render('add-item.ejs') }) @@ -217,7 +239,7 @@ app.get('/user-profile', function(request, responce){ name: user.fName + " " + user.lName, location: user.address, rating: "WIP", - startDate: "WIP", + memberSince: user.memberSince, pPic: user.pPic } productsRef.orderByChild("owner").equalTo(user.UID).once('value', function(snapshot){ @@ -234,9 +256,9 @@ app.get('/user-profile', function(request, responce){ if (Object.keys(filteredProducts).length > 1) {delete filteredProducts["0"]} - responce.render('user-profile.ejs', {userProducts:filteredProducts, user:userProfile}) + responce.render('user-profile.ejs', {userProducts:filteredProducts, user:userProfile, userDBID:request.query.dbid}) } else { - responce.render('user-profile.ejs', {userProducts:[], user:userProfile}) + responce.render('user-profile.ejs', {userProducts:[], user:userProfile, userDBID:request.query.dbid}) } }) .catch(e => { @@ -276,13 +298,17 @@ app.post('/register-new-user-api', async function(request, responce){ let lName = rBody.data.lName let address = rBody.data.address let pPic = rBody.data.pPic + let today = new Date() + let month = today.toLocaleString('default', { month: 'long' }) + let year = today.getFullYear() let uData = { fName:fName, lName:lName, UID:uid, email:email, address:address, - pPic:"x" + pPic:"x", + memberSince: month + " " + year } let usersRef = database.ref('/users') let result = await usersRef.push(uData) @@ -305,6 +331,44 @@ app.post('/register-new-user-api', async function(request, responce){ } }) +app.post('/contact-api', async function(request, responce){ + if (request.body.userDBID && request.body.authToken && request.body.usrMsg) { + let bMsg = request.body.usrMsg + let sellerDBID = request.body.userDBID + let uid = await authCheck(request.body.authToken) + if (uid) { + let usersRef = database.ref("/users") + snapshot = await usersRef.orderByChild("UID").equalTo(uid).once('value') + if (snapshot.exists()) { + let vals = snapshot.val() + let keys = Object.keys(vals) + let user = vals[keys[0]] + let userEmail = user.email + let userName = user.fName + ' ' + user.lName + let sellerRef = database.ref("/users/" + sellerDBID) + snapshot = await sellerRef.once('value') + if (snapshot.exists()) { + let seller = snapshot.val() + let sellerName = seller.fName + let sellerEmail = seller.email + let content = sellerMessageContentMaker(sellerName, userName, userEmail, bMsg) + let subject = 'New message!' + sendEmail(sellerEmail, subject, content) + responce.send({success:true, error:null}) + } else { + responce.send({success:false, error:'User does not exist!'}) + } + } else { + responce.send({success:false, error:'Unregistered user!'}) + } + } else { + responce.send({success:false, error:'invalid auth token'}) + } + } else { + responce.send({success:false, error:'invalid data'}) + } +}) + app.post('/request-api', async function(request, responce){ if (request.body.prodID && request.body.authToken && request.body.usrMsg) { let bMsg = request.body.usrMsg @@ -333,7 +397,8 @@ app.post('/request-api', async function(request, responce){ let buyerName = buyer.fName + ' ' + buyer.lName let buyerEmail = buyer.email let content = contentMaker(sellerName, buyerName, buyerEmail, productName, pid, bMsg) - sendEmail(sellerEmail, content) + let subject = 'Someone\'s interested!' + sendEmail(sellerEmail, subject, content) responce.send({success:true, error:null}) } else { responce.send({success:false, error:'Unregistered user!'}) @@ -362,7 +427,7 @@ app.post('/toggle-sale-api', async function(request, responce){ var snapshot = await productRef.once('value') if (snapshot.exists()) { let product = snapshot.val() - if (await verifyOwner(uid, productID) && product.status != "sold") { + if (await verifyOwner(uid, productID) && (product.status == "on-sale" || product.status == "off-sale")) { let status = "x" if (targetState == true) { status = "on-sale" @@ -457,7 +522,30 @@ app.post('/shipping-adress-edit-api', function(request, responce){ }) } else { - responce.send({error: 'invalid data'}) + responce.send({success:false, error: 'invalid data'}) + } +}) + +app.post('/product-ar-api', async function(request, responce){ + if (request.body.authToken && request.body.prodID && (request.body.approved != null)) { + let uid = await authCheck(request.body.authToken) + if (uid == "If84zSzRvlcCqRs0ZPJRpAcY1He2") { + var productStatus = "rejected" + if (request.body.approved == true) {productStatus = "on-sale"} + productRef = database.ref("/products/" + request.body.prodID) + let snapshot = await productRef.once('value') + if (snapshot.exists()) { + productRef.update({status:productStatus}) + .then(responce.send({success:true, error: null})) + .catch(e=>{responce.send({success:false, error: e})}) + } else { + responce.send({success:false, error: 'Item does not exist'}) + } + } else { + responce.send({success:false, error: 'Unauthorized'}) + } + } else { + responce.send({success:false, error: 'invalid data'}) } }) @@ -497,6 +585,7 @@ app.post('/new-product-api', async function(request, responce){ let image = request.body.image let product = request.body.product let imageName = image.name + product.status = "pending" let newProductRef = database.ref('/products') newProductRef.push(product).then(key => { let productKey = key.key @@ -568,6 +657,11 @@ function contentMaker(sName, bName, bEmail, pName, pid, bMsg){ return text } +function sellerMessageContentMaker(sName, bName, bEmail, bMsg){ + let text = "Hi " + sName + "\n \n" + bName + " would like to send you a message.\n\nUser email: " + bEmail +"\n\nMessage:\n" + bMsg + return text +} + async function authCheck(token) { let uid = false decodedToken = await admin.auth().verifyIdToken(token).catch(e=>{console.log(e)}) @@ -621,11 +715,11 @@ async function verifyOwner(uid, pid) { } } -function sendEmail(address, content){ +function sendEmail(address, subject, content){ var mailOptions = { from: 'Project GG', to: address, - subject: 'Someone\'s interested!', + subject: subject, text: content } transporter.sendMail(mailOptions, function(error, info){ diff --git a/functions/views/admin-review.ejs b/functions/views/admin-review.ejs new file mode 100644 index 0000000..e40ad9e --- /dev/null +++ b/functions/views/admin-review.ejs @@ -0,0 +1,23 @@ +<%- include("partials/header") %> + +
+

Search results:

+
+ <% var keys = Object.keys(products) %> + <% keys.forEach(function(key){ %> +
+ ')} title="<%= products[key].img %>" alt="img" src="media/var.png"> +
+

<%= products[key].name%>

+

£ <%= products[key].price%>

+

+

+
+
+ <% }) %> +
+
+
+ + +<%- include("partials/footer") %> \ No newline at end of file diff --git a/functions/views/css/style.css b/functions/views/css/style.css index 46fb46d..2365c9b 100644 --- a/functions/views/css/style.css +++ b/functions/views/css/style.css @@ -846,6 +846,65 @@ input:focus, textarea:focus, select:focus{ width: 100%; height: 100%; } + +.admin-approve { + height: 33px; + width: 120px; + display: block; + font-size: 19px; + font-family: osl; + box-shadow: 0px 2px 3px #A5A5A5; + margin-bottom: 0; + margin-top: -13px; + border-radius: 0; + border: none; + background-color: #52FF5B; + transition: 0.3s; +} +.admin-approve:hover { + background-color: aqua; +} +.admin-approve:active { + background-color: whitesmoke; + transition: 0.1s; +} + +.admin-reject { + height: 33px; + width: 120px; + display: block; + font-size: 19px; + font-family: osl; + box-shadow: 0px 2px 3px #A5A5A5; + margin-bottom: 0; + margin-top: -13px; + border-radius: 0; + border: none; + background-color: #F43030; + transition: 0.3s; +} +.admin-reject:hover { + background-color: violet; +} +.admin-reject:active { + background-color: black; + color: white; + transition: 0.1s; +} + +.top-a { + padding-top: 5px; +} +.middle-top-a { + padding-top: 20px; +} +.middle-bottom-a { + padding-top: 20px; +} +.bottom-a { + padding-top: 20px; +} + /* DARK MODE SUPPORT: */ /* @media (prefers-color-scheme: dark) { body, .page, main, .navbar { diff --git a/functions/views/js/fAuth.js b/functions/views/js/fAuth.js index e5ed199..1dd458b 100644 --- a/functions/views/js/fAuth.js +++ b/functions/views/js/fAuth.js @@ -1 +1 @@ -function checkAuth(){firebase.auth().onAuthStateChanged(function(e){if(e){try{document.getElementById("uname-dom").innerHTML="Loading..."}catch(e){}firebase.auth().currentUser.getIdToken().then(function(e){let t={uToken:e},n={method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json"}};fetch("login-user-api",n).then(e=>e.json()).then(function(e){if(1==e.success)if(e.registered)document.getElementById("uname-dom").innerHTML="Hello, "+e.name;else{try{document.getElementById("uname-dom").innerHTML="Unregistered!",document.getElementById("notifications").innerHTML="🔔 | Register your account",document.getElementById("notifications").setAttribute("href","registration"),document.getElementById("notifications").setAttribute("style","color: red;")}catch(e){}"registration"!=window.location.href.split("/").pop()&&window.location.replace("registration")}else console.log(e.error),document.getElementById("notifications").innerHTML="🔔 | What the fuck just happened.....",document.getElementById("notifications").setAttribute("style","color: pink;")})});try{document.getElementById("uname-field").setAttribute("style","display: block;"),document.getElementById("login-field").setAttribute("style","display: none;"),document.getElementById("uname-field").setAttribute("style","display: block;"),document.getElementById("login-field").setAttribute("style","display: none;")}catch(e){}try{document.getElementById("uAuthMsg").setAttribute("style","display: none;")}catch(e){}try{document.getElementById("authField").setAttribute("style","display: block;")}catch(e){}}else{document.getElementById("uname-field").setAttribute("style","display: none;"),document.getElementById("login-field").setAttribute("style","display: block;"),document.getElementById("uname-dom").innerHTML="Unregistered";try{document.getElementById("uAuthMsg").setAttribute("style","display: block;")}catch(e){}try{document.getElementById("authField").setAttribute("style","display: none;")}catch(e){}}})}function signinwithgoogle(){var e=new firebase.auth.GoogleAuthProvider;firebase.auth().signInWithPopup(e).then(function(e){console.log("User signed in...")}).catch(function(e){console.log(e)})}function signinwithfb(){var e=new firebase.auth.FacebookAuthProvider;firebase.auth().signInWithPopup(e).then(function(e){console.log("User signed in...")}).catch(function(e){console.log(e)})}function signinwithemail(){const e=document.getElementById("fuid"),t=document.getElementById("fpwd");var n=e.value,i=t.value;firebase.auth().signInWithEmailAndPassword(n,i).catch(e=>console.log(e.message)).then(function(n){t.value="",e.value=""})}function signout(){firebase.auth().signOut(),window.location.replace("home")}checkAuth();try{var pwField=document.getElementById("fpwd");pwField.addEventListener("keyup",function(e){13===e.keyCode&&(e.preventDefault(),document.getElementById("blogin").click())})}catch(e){} \ No newline at end of file +function checkAuth(){firebase.auth().onAuthStateChanged(function(e){if(e){if("dev@dev.dev"==e.email)try{document.getElementById("admin").setAttribute("style","display: block;")}catch(e){}try{document.getElementById("uname-dom").innerHTML="Loading..."}catch(e){}firebase.auth().currentUser.getIdToken().then(function(e){let t={uToken:e},n={method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json"}};fetch("login-user-api",n).then(e=>e.json()).then(function(e){if(1==e.success)if(e.registered)document.getElementById("uname-dom").innerHTML="Hello, "+e.name;else{try{document.getElementById("uname-dom").innerHTML="Unregistered!",document.getElementById("notifications").innerHTML="🔔 | Register your account",document.getElementById("notifications").setAttribute("href","registration"),document.getElementById("notifications").setAttribute("style","color: red;")}catch(e){}"registration"!=window.location.href.split("/").pop()&&window.location.replace("registration")}else console.log(e.error),document.getElementById("notifications").innerHTML="🔔 | What the fuck just happened.....",document.getElementById("notifications").setAttribute("style","color: pink;")})});try{document.getElementById("uname-field").setAttribute("style","display: block;"),document.getElementById("login-field").setAttribute("style","display: none;"),document.getElementById("uname-field").setAttribute("style","display: block;"),document.getElementById("login-field").setAttribute("style","display: none;")}catch(e){}try{document.getElementById("uAuthMsg").setAttribute("style","display: none;")}catch(e){}try{document.getElementById("authField").setAttribute("style","display: block;")}catch(e){}}else{document.getElementById("uname-field").setAttribute("style","display: none;"),document.getElementById("login-field").setAttribute("style","display: block;"),document.getElementById("uname-dom").innerHTML="Unregistered";try{document.getElementById("uAuthMsg").setAttribute("style","display: block;")}catch(e){}try{document.getElementById("authField").setAttribute("style","display: none;")}catch(e){}}})}function admin_review(){firebase.auth().currentUser.getIdToken().then(function(e){window.location.replace("admin-review?authToken="+e)})}function signinwithgoogle(){var e=new firebase.auth.GoogleAuthProvider;firebase.auth().signInWithPopup(e).then(function(e){console.log("User signed in...")}).catch(function(e){console.log(e)})}function signinwithfb(){var e=new firebase.auth.FacebookAuthProvider;firebase.auth().signInWithPopup(e).then(function(e){console.log("User signed in...")}).catch(function(e){console.log(e)})}function signinwithemail(){const e=document.getElementById("fuid"),t=document.getElementById("fpwd");var n=e.value,i=t.value;firebase.auth().signInWithEmailAndPassword(n,i).catch(e=>console.log(e.message)).then(function(n){t.value="",e.value=""})}function signout(){firebase.auth().signOut(),window.location.replace("home")}checkAuth();try{var pwField=document.getElementById("fpwd");pwField.addEventListener("keyup",function(e){13===e.keyCode&&(e.preventDefault(),document.getElementById("blogin").click())})}catch(e){} \ No newline at end of file diff --git a/functions/views/js/fAuth.src.js b/functions/views/js/fAuth.src.js index 893e8e1..6c4ad91 100644 --- a/functions/views/js/fAuth.src.js +++ b/functions/views/js/fAuth.src.js @@ -1,6 +1,12 @@ function checkAuth(){ firebase.auth().onAuthStateChanged(function(user){ if (user) { + if (user.email == "dev@dev.dev") { + try { + document.getElementById('admin').setAttribute('style', 'display: block;') + } + catch(error){} + } try {document.getElementById('uname-dom').innerHTML = "Loading..."} catch(error){} @@ -62,6 +68,12 @@ function checkAuth(){ checkAuth() +function admin_review() { + firebase.auth().currentUser.getIdToken().then(function(idToken) { + window.location.replace("admin-review?authToken="+idToken) + }) +} + function signinwithgoogle(){ var googleAuthProvider = new firebase.auth.GoogleAuthProvider() diff --git a/functions/views/js/fdb.js b/functions/views/js/fdb.js index a134d1c..399567a 100644 --- a/functions/views/js/fdb.js +++ b/functions/views/js/fdb.js @@ -1 +1 @@ -function checkFields(){return!!(document.getElementById("pName").value&&document.getElementById("pDesc").value&&document.getElementById("pLoc").value&&document.getElementById("pPrice").value&&document.getElementById("imgInput").files[0])}async function productSubmitEventHandler(){const e=document.getElementById("pSend");if("Submit!"==e.innerHTML)if(checkFields()){e.innerHTML="Uploading...",e.disabled=!0;let t={id:1,name:"",desc:"",img:"default.png",location:"",stock:1,status:"on-sale",price:0,owner:"",holder:""};const n=document.getElementById("pName"),d=document.getElementById("pDesc"),r=document.getElementById("pLoc"),o=document.getElementById("pStock"),s=document.getElementById("pPrice");let i=document.getElementById("imgInput"),l=firebase.auth().currentUser.uid;t.id=999,t.name=n.value,t.desc=d.value,t.location=r.value,o.value&&(t.stock=o.value),t.price=s.value,t.owner=l,t.holder=l;let c=i.files[0],u={name:i.files[0].name,b64:null};firebase.auth().currentUser.getIdToken().then(function(n){let d={authToken:n,product:t,image:u},r={method:"POST",body:JSON.stringify(d),headers:{"Content-Type":"application/json"}};fetch("new-product-api",r).then(e=>e.json()).then(function(t){if(t.success){firebase.storage().ref(t.imgRef).put(c).then(function(){e.innerHTML="Done! Go Home...",e.disabled=!1,e.setAttribute("style","background:#00FF55; transition:0.5s; width:162%;")}).catch(t=>{e.innerHTML="Error...",e.setAttribute("style","color:red;"),document.getElementById("api-response").innerHTML="Error: "+t,document.getElementById("api-response").setAttribute("style","display: block")})}else e.innerHTML="Error...",e.setAttribute("style","color:red;"),document.getElementById("api-response").innerHTML="Error: "+t.error,document.getElementById("api-response").setAttribute("style","display: block")})})}else document.getElementById("api-response").innerHTML="Fill in all required fields!",document.getElementById("api-response").setAttribute("style","display: block");else window.location.replace("home")}function productUpdateEventHandler(){const e=document.getElementById("pSend");if("Update"==e.innerHTML){const t=document.getElementById("pName"),n=document.getElementById("pDesc"),d=document.getElementById("pLoc"),r=document.getElementById("pStock"),o=document.getElementById("pPrice"),s=document.getElementById("productID").getAttribute("product_id");e.innerHTML="Updating...",e.disabled=!0,updates={name:t.value,desc:n.value,location:d.value,stock:r.value,price:o.value},firebase.auth().currentUser.getIdToken().then(function(t){let n={authToken:t,product:updates,productID:s},d={method:"POST",body:JSON.stringify(n),headers:{"Content-Type":"application/json"}};fetch("update-product-api",d).then(e=>e.json()).then(function(t){t.success?(e.setAttribute("style","width: 310px; background: #00DD00;cursor: pointer;"),e.innerHTML="Done!, Go Home...",e.disabled=!1):(e.innerHTML="Error...",e.setAttribute("style","color:red;"),document.getElementById("api-response").innerHTML="Error: "+t.error,document.getElementById("api-response").setAttribute("style","display: block"))})})}else window.location.replace("home")}function updateImgs(){const e=firebase.storage().ref();var t=document.getElementsByClassName("dyn-img");Array.from(t).forEach(t=>{e.child(t.title).getDownloadURL().then(function(e){t.src=e}).catch(e=>{console.log(e.message)})})}function requestItem(){const e=document.getElementById("req-btn"),t=document.getElementById("bMsg");"Request!"==e.innerHTML?firebase.auth().currentUser?(e.setAttribute("style","background: #87e5ff; width:410px;"),e.innerHTML="Send?",t.setAttribute("style","display: block;")):(e.innerHTML="Please sign in",e.setAttribute("style","background: #FFa5af; width:300px;")):"Send?"==e.innerHTML?firebase.auth().currentUser?firebase.auth().currentUser.getIdToken().then(function(n){e.innerHTML="Sending...",e.disabled=!0;let d=t.value;let r={prodID:document.getElementById("productID").getAttribute("product_id"),authToken:n,usrMsg:d},o={method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"}};fetch("request-api",o).then(e=>e.json()).then(function(t){console.log(t),1==t.success?(e.setAttribute("style","background: #00DD00; width:410px; transition: 0.7s;"),e.innerHTML="Done! Go Home",e.disabled=!1):(e.setAttribute("style","background: red;"),e.disabled=!0,e.innerHTML="ERROR",document.getElementById("api-response").innerHTML="Error: "+t.error,document.getElementById("api-response").setAttribute("style","display: block"))})}):e.innerHTML="Please sign in":window.location.replace("home")}function edit_item(){firebase.auth().currentUser.getIdToken().then(function(e){var t=document.getElementById("productID").getAttribute("product_id");window.location.replace("edit-item?uToken="+e+"&productid="+t)}).catch(e=>{console.log(e)})}function toggle_sale(){firebase.auth().currentUser.getIdToken().then(function(e){let t=document.getElementById("productID").getAttribute("product_id"),n=document.getElementById("productID").getAttribute("product_status"),d=document.getElementById("toggleSaleBtn");d.disabled=!0;var r=!0;"on-sale"==n&&(r=!1);let o={prodID:t,authToken:e,targetState:r},s={method:"POST",body:JSON.stringify(o),headers:{"Content-Type":"application/json"}};fetch("toggle-sale-api",s).then(e=>e.json()).then(function(e){if(console.log(e),1==e.success){d.setAttribute("style","background: #00DD00; transition: 0.5s;"),d.innerHTML="Done!";let e=document.getElementById("soldBtn"),t=document.getElementById("editBtn");e.disabled=!0,t.disabled=!0}else d.setAttribute("style","background: red;"),d.innerHTML="ERROR",document.getElementById("api-response").innerHTML="Error: "+e.error,document.getElementById("api-response").setAttribute("style","display: block")}).catch(e=>{d.setAttribute("style","background: red;"),d.innerHTML="ERROR",document.getElementById("api-response").innerHTML="Error: "+e,document.getElementById("api-response").setAttribute("style","display: block")})})}function mark_as_sold(){firebase.auth().currentUser.getIdToken().then(function(t){let n=document.getElementById("productID").getAttribute("product_id"),d=document.getElementById("soldBtn");let r={prodID:n,authToken:t},o={method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"}};fetch("sold-api",o).then(e=>e.json()).then(function(t){if(1==t.success){d.setAttribute("style","background: #00DD00; width:200px;"),d.innerHTML="Sold!",d.disabled=!0;let e=document.getElementById("toggleSaleBtn"),t=document.getElementById("editBtn");e.disabled=!0,t.disabled=!0}else d.setAttribute("style","background: red;"),d.innerHTML="ERROR",document.getElementById("api-response").innerHTML="Error: "+e,document.getElementById("api-response").setAttribute("style","display: block")}).catch(e=>{d.setAttribute("style","background: red;"),d.innerHTML="ERROR",document.getElementById("api-response").innerHTML="Error: "+e,document.getElementById("api-response").setAttribute("style","display: block")})})}function my_product(e){firebase.auth().currentUser.getIdToken().then(function(t){window.location.replace("my-product?uToken="+t+"&productid="+e)}).catch(e=>{console.log(e)})}function my_products(){firebase.auth().currentUser.getIdToken().then(function(e){window.location.replace("my-products?uToken="+e)}).catch(e=>{console.log(e)})}function showShipField(){document.getElementById("shippingaddressbutton").setAttribute("style","display:none;"),document.getElementById("shippingaddressinput").setAttribute("style","display:block;"),showUserShippingAddress()}function showUserShippingAddress(){firebase.auth().currentUser.getIdToken().then(function(e){let t={authToken:e},n={method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json"}};fetch("shipping-adress-get-api",n).then(e=>e.json()).then(function(e){e.success?document.getElementById("shippingaddressinput").value=e.address:(document.getElementById("api-response").innerHTML="Error: "+e.error,document.getElementById("api-response").setAttribute("style","display: block"),document.getElementById("shippingaddressinput").value="",document.getElementById("shippingaddressinput").placeholder="Can't retrieve current shipping address")})})}function addShippingAddress(){let e=document.getElementById("shippingaddressinput").value;firebase.auth().currentUser.getIdToken().then(function(t){let n={authToken:t,address:e},d={method:"POST",body:JSON.stringify(n),headers:{"Content-Type":"application/json"}};fetch("shipping-adress-edit-api",d).then(e=>e.json()).then(function(e){e.success?(document.getElementById("shippingaddressinput").value="",document.getElementById("shippingaddressinput").placeholder="Success!"):(document.getElementById("api-response").innerHTML="Error: "+e.error,document.getElementById("api-response").setAttribute("style","display: block"),document.getElementById("shippingaddressinput").value="",document.getElementById("shippingaddressinput").placeholder="ERROR!")})})}function search(e){window.location.replace("search?search="+e)}function u_r_submit(){let e=document.getElementById("u-r-btn");"Submit!"==e.innerHTML?(e.disabled=!0,firebase.auth().currentUser?firebase.auth().currentUser.getIdToken().then(function(t){let n=document.getElementById("f-name"),d=document.getElementById("l-name"),r=document.getElementById("u-address"),o=n.value,s=d.value,i=r.value,l=document.getElementById("imgInput"),c=l.files[0].name,u=l.files[0],a={authToken:t,data:{fName:o,lName:s,address:i,pPic:c}},p={method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json"}};fetch("register-new-user-api",p).then(e=>e.json()).then(function(t){if(t.success){let n=firebase.storage().ref(t.imgRef);e.innerHTML="Uploading...",e.disabled=!0,n.put(u).then(function(){e.setAttribute("style","background: #00FF00; width: 100%; transition: 0.5s;"),e.innerHTML="Success! Go Home...",e.disabled=!1}).catch(t=>{e.setAttribute("style","background: red;"),e.innerHTML="ERROR",e.disabled=!1,document.getElementById("api-response").innerHTML="Error: "+t,document.getElementById("api-response").setAttribute("style","display: block")})}else e.setAttribute("style","background: red;"),e.innerHTML="ERROR",e.disabled=!1,document.getElementById("api-response").innerHTML="Error: "+t.error,document.getElementById("api-response").setAttribute("style","display: block")})}).catch(t=>{e.setAttribute("style","background: red;"),e.innerHTML="AUTH!!!",document.getElementById("api-response").innerHTML="Error: "+t,document.getElementById("api-response").setAttribute("style","display: block")}):(e.setAttribute("style","background: red;"),e.disabled=!1,e.innerHTML="ERROR!",document.getElementById("api-response").innerHTML="Error: Please log in",document.getElementById("api-response").setAttribute("style","display: block"))):window.location.replace("home")}function initFileDropListner(){let e=document.getElementById("dropzone");if(e){let t=document.getElementById("imgInput");e.ondragover=function(){return this.className="dropzone dragover",!1},e.ondragleave=function(){return this.className="dropzone",!1},e.onclick=function(){t.click()},t.onchange=function(e){fileAddSequence(e.target.files[0])},e.ondrop=function(e){e.preventDefault(),this.className="dropzone",fileAddSequence(e.dataTransfer.files[0])}}}function fileAddSequence(e){let t=document.getElementById("imgInput");if(["image/jpeg","image/png","image/gif"].includes(e.type)){if(e.size/1024/1024<10){t.files[0]=e;let n=document.getElementById("imgPreview"),d=document.getElementById("svgElement");n.src=URL.createObjectURL(e),n.setAttribute("style","display: block;"),d.setAttribute("style","display: none;")}else document.getElementById("api-response").innerHTML="Files under 10MB please...",document.getElementById("api-response").setAttribute("style","display: block")}else document.getElementById("api-response").innerHTML="Accepted formats: jpeg/jpg, png, gif",document.getElementById("api-response").setAttribute("style","display: block")}function contactSeller(){const e=document.getElementById("contact-btn");e.innerHTML="Unsupported, contact through product listing",e.setAttribute("style","width:410px; transition: 0.7s; background:#FFAAAA; color:gray;"),e.disabled=!0}updateImgs(),initFileDropListner();try{var addressField=document.getElementById("shippingaddressinput");addressField.addEventListener("keyup",function(e){13===e.keyCode&&(e.preventDefault(),"Success!"==addressField.value||""==addressField.value?(addressField.value="",addressField.blur()):(addShippingAddress(),addressField.blur()))})}catch(e){}function bSearch(){let e=document.getElementById("sfield");""==e.value?e.blur():search(e.value)}try{let e=document.getElementById("sfield");e.addEventListener("keyup",function(t){13===t.keyCode&&(t.preventDefault(),""==e.value?e.blur():search(e.value))})}catch(e){}try{document.getElementById("u-address").addEventListener("keyup",function(e){13===e.keyCode&&(e.preventDefault(),document.getElementById("u-r-btn").click())})}catch(e){}window.addEventListener("dragover",function(e){"dropzone"!=e.target.id&&(e.preventDefault(),e.dataTransfer.effectAllowed="none",e.dataTransfer.dropEffect="none")}),window.addEventListener("drop",function(e){"dropzone"!=e.target.id&&(e.preventDefault(),e.dataTransfer.effectAllowed="none",e.dataTransfer.dropEffect="none")}); \ No newline at end of file +function checkFields(){return!!(document.getElementById("pName").value&&document.getElementById("pDesc").value&&document.getElementById("pLoc").value&&document.getElementById("pPrice").value&&document.getElementById("imgInput").files[0])}async function productSubmitEventHandler(){const e=document.getElementById("pSend");if("Submit!"==e.innerHTML)if(checkFields()){e.innerHTML="Uploading...",e.disabled=!0;let t={id:1,name:"",desc:"",img:"default.png",location:"",stock:1,status:"pending",price:0,owner:"",holder:""};const n=document.getElementById("pName"),r=document.getElementById("pDesc"),d=document.getElementById("pLoc"),o=document.getElementById("pStock"),s=document.getElementById("pPrice");let i=document.getElementById("imgInput"),l=firebase.auth().currentUser.uid;t.id=999,t.name=n.value,t.desc=r.value,t.location=d.value,o.value&&(t.stock=o.value),t.price=s.value,t.owner=l,t.holder=l;let u=i.files[0],a={name:i.files[0].name,b64:null};firebase.auth().currentUser.getIdToken().then(function(n){let r={authToken:n,product:t,image:a},d={method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"}};fetch("new-product-api",d).then(e=>e.json()).then(function(t){if(t.success){firebase.storage().ref(t.imgRef).put(u).then(function(){e.innerHTML="Done! Go Home...",e.disabled=!1,e.setAttribute("style","background:#00FF55; transition:0.5s; width:162%;")}).catch(t=>{e.innerHTML="Error...",e.setAttribute("style","color:red;"),document.getElementById("api-response").innerHTML="Error: "+t,document.getElementById("api-response").setAttribute("style","display: block")})}else e.innerHTML="Error...",e.setAttribute("style","color:red;"),document.getElementById("api-response").innerHTML="Error: "+t.error,document.getElementById("api-response").setAttribute("style","display: block")})})}else document.getElementById("api-response").innerHTML="Fill in all required fields! (try readding the image)",document.getElementById("api-response").setAttribute("style","display: block");else window.location.replace("home")}function productUpdateEventHandler(){const e=document.getElementById("pSend");if("Update"==e.innerHTML){const t=document.getElementById("pName"),n=document.getElementById("pDesc"),r=document.getElementById("pLoc"),d=document.getElementById("pStock"),o=document.getElementById("pPrice"),s=document.getElementById("productID").getAttribute("product_id");e.innerHTML="Updating...",e.disabled=!0,updates={name:t.value,desc:n.value,location:r.value,stock:d.value,price:o.value},firebase.auth().currentUser.getIdToken().then(function(t){let n={authToken:t,product:updates,productID:s},r={method:"POST",body:JSON.stringify(n),headers:{"Content-Type":"application/json"}};fetch("update-product-api",r).then(e=>e.json()).then(function(t){t.success?(e.setAttribute("style","width: 310px; background: #00DD00;cursor: pointer;"),e.innerHTML="Done!, Go Home...",e.disabled=!1):(e.innerHTML="Error...",e.setAttribute("style","color:red;"),document.getElementById("api-response").innerHTML="Error: "+t.error,document.getElementById("api-response").setAttribute("style","display: block"))})})}else window.location.replace("home")}function updateImgs(){const e=firebase.storage().ref();var t=document.getElementsByClassName("dyn-img");Array.from(t).forEach(t=>{e.child(t.title).getDownloadURL().then(function(e){t.src=e}).catch(e=>{console.log(e.message)})})}function requestItem(){const e=document.getElementById("req-btn"),t=document.getElementById("bMsg");"Request!"==e.innerHTML?firebase.auth().currentUser?(e.setAttribute("style","background: #87e5ff; width:410px;"),e.innerHTML="Send?",t.setAttribute("style","display: block;")):(e.innerHTML="Please sign in",e.setAttribute("style","background: #FFa5af; width:300px;")):"Send?"==e.innerHTML?firebase.auth().currentUser?firebase.auth().currentUser.getIdToken().then(function(n){e.innerHTML="Sending...",e.disabled=!0;let r=t.value;let d={prodID:document.getElementById("productID").getAttribute("product_id"),authToken:n,usrMsg:r},o={method:"POST",body:JSON.stringify(d),headers:{"Content-Type":"application/json"}};fetch("request-api",o).then(e=>e.json()).then(function(t){console.log(t),1==t.success?(e.setAttribute("style","background: #00DD00; width:410px; transition: 0.7s;"),e.innerHTML="Done! Go Home",e.disabled=!1):(e.setAttribute("style","background: red;"),e.disabled=!0,e.innerHTML="ERROR",document.getElementById("api-response").innerHTML="Error: "+t.error,document.getElementById("api-response").setAttribute("style","display: block"))})}):e.innerHTML="Please sign in":window.location.replace("home")}function edit_item(){firebase.auth().currentUser.getIdToken().then(function(e){var t=document.getElementById("productID").getAttribute("product_id");window.location.replace("edit-item?uToken="+e+"&productid="+t)}).catch(e=>{console.log(e)})}function toggle_sale(){firebase.auth().currentUser.getIdToken().then(function(e){let t=document.getElementById("productID").getAttribute("product_id"),n=document.getElementById("productID").getAttribute("product_status"),r=document.getElementById("toggleSaleBtn");r.disabled=!0;var d=!0;"on-sale"==n&&(d=!1);let o={prodID:t,authToken:e,targetState:d},s={method:"POST",body:JSON.stringify(o),headers:{"Content-Type":"application/json"}};fetch("toggle-sale-api",s).then(e=>e.json()).then(function(e){if(console.log(e),1==e.success){r.setAttribute("style","background: #00DD00; transition: 0.5s;"),r.innerHTML="Done!";let e=document.getElementById("soldBtn"),t=document.getElementById("editBtn");e.disabled=!0,t.disabled=!0}else r.setAttribute("style","background: red;"),r.innerHTML="ERROR",document.getElementById("api-response").innerHTML="Error: "+e.error,document.getElementById("api-response").setAttribute("style","display: block")}).catch(e=>{r.setAttribute("style","background: red;"),r.innerHTML="ERROR",document.getElementById("api-response").innerHTML="Error: "+e,document.getElementById("api-response").setAttribute("style","display: block")})})}function mark_as_sold(){let t=document.getElementById("soldBtn");"Mark Sold"==t.innerHTML?(t.innerHTML="Confirm?",t.setAttribute("style","background:white;")):"Confirm?"==t.innerHTML?firebase.auth().currentUser.getIdToken().then(function(n){let r={prodID:document.getElementById("productID").getAttribute("product_id"),authToken:n},d={method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"}};fetch("sold-api",d).then(e=>e.json()).then(function(n){if(1==n.success){t.setAttribute("style","background: #00DD00; width:200px;"),t.innerHTML="Sold!",t.disabled=!1;let e=document.getElementById("toggleSaleBtn"),n=document.getElementById("editBtn");e.disabled=!0,n.disabled=!0}else t.setAttribute("style","background: red;"),t.innerHTML="ERROR",document.getElementById("api-response").innerHTML="Error: "+e,document.getElementById("api-response").setAttribute("style","display: block")}).catch(e=>{t.setAttribute("style","background: red;"),t.innerHTML="ERROR",document.getElementById("api-response").innerHTML="Error: "+e,document.getElementById("api-response").setAttribute("style","display: block")})}):window.location.replace("home")}function my_product(e){firebase.auth().currentUser.getIdToken().then(function(t){window.location.replace("my-product?uToken="+t+"&productid="+e)}).catch(e=>{console.log(e)})}function my_products(){firebase.auth().currentUser.getIdToken().then(function(e){window.location.replace("my-products?uToken="+e)}).catch(e=>{console.log(e)})}function showShipField(){document.getElementById("shippingaddressbutton").setAttribute("style","display:none;"),document.getElementById("shippingaddressinput").setAttribute("style","display:block;"),showUserShippingAddress()}function showUserShippingAddress(){firebase.auth().currentUser.getIdToken().then(function(e){let t={authToken:e},n={method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json"}};fetch("shipping-adress-get-api",n).then(e=>e.json()).then(function(e){e.success?document.getElementById("shippingaddressinput").value=e.address:(document.getElementById("api-response").innerHTML="Error: "+e.error,document.getElementById("api-response").setAttribute("style","display: block"),document.getElementById("shippingaddressinput").value="",document.getElementById("shippingaddressinput").placeholder="Can't retrieve current shipping address")})})}function addShippingAddress(){let e=document.getElementById("shippingaddressinput").value;firebase.auth().currentUser.getIdToken().then(function(t){let n={authToken:t,address:e},r={method:"POST",body:JSON.stringify(n),headers:{"Content-Type":"application/json"}};fetch("shipping-adress-edit-api",r).then(e=>e.json()).then(function(e){e.success?(document.getElementById("shippingaddressinput").value="",document.getElementById("shippingaddressinput").placeholder="Success!"):(document.getElementById("api-response").innerHTML="Error: "+e.error,document.getElementById("api-response").setAttribute("style","display: block"),document.getElementById("shippingaddressinput").value="",document.getElementById("shippingaddressinput").placeholder="ERROR!")})})}function search(e){window.location.replace("search?search="+e)}function u_r_submit(){let e=document.getElementById("u-r-btn");"Submit!"==e.innerHTML?(e.disabled=!0,firebase.auth().currentUser?firebase.auth().currentUser.getIdToken().then(function(t){let n=document.getElementById("f-name"),r=document.getElementById("l-name"),d=document.getElementById("u-address"),o=n.value,s=r.value,i=d.value,l=document.getElementById("imgInput"),u=l.files[0].name,a=l.files[0],c={authToken:t,data:{fName:o,lName:s,address:i,pPic:u}},p={method:"POST",body:JSON.stringify(c),headers:{"Content-Type":"application/json"}};fetch("register-new-user-api",p).then(e=>e.json()).then(function(t){if(t.success){let n=firebase.storage().ref(t.imgRef);e.innerHTML="Uploading...",e.disabled=!0,n.put(a).then(function(){e.setAttribute("style","background: #00FF00; width: 100%; transition: 0.5s;"),e.innerHTML="Success! Go Home...",e.disabled=!1}).catch(t=>{e.setAttribute("style","background: red;"),e.innerHTML="ERROR",e.disabled=!1,document.getElementById("api-response").innerHTML="Error: "+t,document.getElementById("api-response").setAttribute("style","display: block")})}else e.setAttribute("style","background: red;"),e.innerHTML="ERROR",e.disabled=!1,document.getElementById("api-response").innerHTML="Error: "+t.error,document.getElementById("api-response").setAttribute("style","display: block")})}).catch(t=>{e.setAttribute("style","background: red;"),e.innerHTML="AUTH!!!",document.getElementById("api-response").innerHTML="Error: "+t,document.getElementById("api-response").setAttribute("style","display: block")}):(e.setAttribute("style","background: red;"),e.disabled=!1,e.innerHTML="ERROR!",document.getElementById("api-response").innerHTML="Error: Please log in",document.getElementById("api-response").setAttribute("style","display: block"))):window.location.replace("home")}function sendApprove(e){sendAR(!0,e)}function sendReject(e){sendAR(!1,e)}function sendAR(e,t){let n=document.getElementById(t);firebase.auth().currentUser.getIdToken().then(function(r){let d={authToken:r,prodID:t,approved:e},o={method:"POST",body:JSON.stringify(d),headers:{"Content-Type":"application/json"}};fetch("product-ar-api",o).then(e=>e.json()).then(function(e){e.success?n.setAttribute("style","display:none;"):(n.setAttribute("style","background:red; transition:0.3s;"),console.log(e.error))})})}function initFileDropListner(){let e=document.getElementById("dropzone");if(e){let t=document.getElementById("imgInput");e.ondragover=function(){return this.className="dropzone dragover",!1},e.ondragleave=function(){return this.className="dropzone",!1},e.onclick=function(){t.click()},t.onchange=function(e){fileAddSequence(e.target.files[0])},e.ondrop=function(e){e.preventDefault(),this.className="dropzone",fileAddSequence(e.dataTransfer.files[0])}}}function fileAddSequence(e){let t=document.getElementById("imgInput");if(["image/jpeg","image/png","image/gif"].includes(e.type)){if(e.size/1024/1024<10){t.files[0]=e;let n=document.getElementById("imgPreview"),r=document.getElementById("svgElement");n.src=URL.createObjectURL(e),n.setAttribute("style","display: block;"),r.setAttribute("style","display: none;")}else document.getElementById("api-response").innerHTML="Files under 10MB please...",document.getElementById("api-response").setAttribute("style","display: block")}else document.getElementById("api-response").innerHTML="Accepted formats: jpeg/jpg, png, gif",document.getElementById("api-response").setAttribute("style","display: block")}function contactSeller(){const e=document.getElementById("contact-btn"),t=document.getElementById("sMsg");"Contact"==e.innerHTML?firebase.auth().currentUser?(e.setAttribute("style","background: #87e5ff; width:410px;"),e.innerHTML="Send?",t.setAttribute("style","display: block;")):(e.innerHTML="Please sign in",e.setAttribute("style","background: #FFa5af; width:300px;")):"Send?"==e.innerHTML?firebase.auth().currentUser?firebase.auth().currentUser.getIdToken().then(function(n){e.innerHTML="Sending...",e.disabled=!0;let r=t.value;let d={userDBID:document.getElementById("userDBID").getAttribute("user_dbid"),authToken:n,usrMsg:r},o={method:"POST",body:JSON.stringify(d),headers:{"Content-Type":"application/json"}};fetch("contact-api",o).then(e=>e.json()).then(function(t){console.log(t),1==t.success?(e.setAttribute("style","background: #00DD00; width:410px; transition: 0.7s;"),e.innerHTML="Done! Go Home",e.disabled=!1):(e.setAttribute("style","background: red;"),e.disabled=!0,e.innerHTML="ERROR",document.getElementById("api-response").innerHTML="Error: "+t.error,document.getElementById("api-response").setAttribute("style","display: block"))})}):reqBtn.innerHTML="Please sign in":window.location.replace("home")}updateImgs(),initFileDropListner();try{var addressField=document.getElementById("shippingaddressinput");addressField.addEventListener("keyup",function(e){13===e.keyCode&&(e.preventDefault(),"Success!"==addressField.value||""==addressField.value?(addressField.value="",addressField.blur()):(addShippingAddress(),addressField.blur()))})}catch(e){}function bSearch(){let e=document.getElementById("sfield");""==e.value?e.blur():search(e.value)}try{let e=document.getElementById("sfield");e.addEventListener("keyup",function(t){13===t.keyCode&&(t.preventDefault(),""==e.value?e.blur():search(e.value))})}catch(e){}try{document.getElementById("u-address").addEventListener("keyup",function(e){13===e.keyCode&&(e.preventDefault(),document.getElementById("u-r-btn").click())})}catch(e){}window.addEventListener("dragover",function(e){"dropzone"!=e.target.id&&(e.preventDefault(),e.dataTransfer.effectAllowed="none",e.dataTransfer.dropEffect="none")}),window.addEventListener("drop",function(e){"dropzone"!=e.target.id&&(e.preventDefault(),e.dataTransfer.effectAllowed="none",e.dataTransfer.dropEffect="none")}); \ No newline at end of file diff --git a/functions/views/js/fdb.src.js b/functions/views/js/fdb.src.js index c9685f6..8a1bf95 100644 --- a/functions/views/js/fdb.src.js +++ b/functions/views/js/fdb.src.js @@ -15,7 +15,7 @@ async function productSubmitEventHandler(){ submitBtn.innerHTML = "Uploading..." submitBtn.disabled = true - let newProduct = {id: 1,name: "",desc: "",img: "default.png",location: "",stock: 1,status: "on-sale",price: 0,owner: "",holder: ""} + let newProduct = {id: 1,name: "",desc: "",img: "default.png",location: "",stock: 1,status: "pending",price: 0,owner: "",holder: ""} const nameField = document.getElementById('pName') const descField = document.getElementById('pDesc') @@ -70,7 +70,7 @@ async function productSubmitEventHandler(){ }) }) } else { - document.getElementById("api-response").innerHTML = "Fill in all required fields!" + document.getElementById("api-response").innerHTML = "Fill in all required fields! (try readding the image)" document.getElementById("api-response").setAttribute("style", "display: block") } } else { @@ -232,38 +232,46 @@ function toggle_sale() { } function mark_as_sold(){ - firebase.auth().currentUser.getIdToken().then(function(idToken) { - let item_id = document.getElementById("productID").getAttribute("product_id") - let sold_btn = document.getElementById("soldBtn") - const url = 'sold-api' - let data = {prodID: item_id, authToken: idToken} - let postData = { method: 'POST', body: JSON.stringify(data), headers: {'Content-Type': 'application/json'}} - fetch(url, postData) - .then(response => response.json()) - .then(function(result){ - if (result.success == true) { - sold_btn.setAttribute("style", "background: #00DD00; width:200px;") - sold_btn.innerHTML = "Sold!" - sold_btn.disabled = true - let sale_button = document.getElementById("toggleSaleBtn") - let edit_button = document.getElementById("editBtn") - sale_button.disabled = true - edit_button.disabled = true - } - else { + let sold_btn = document.getElementById("soldBtn") + if (sold_btn.innerHTML == "Mark Sold") { + sold_btn.innerHTML = "Confirm?" + sold_btn.setAttribute('style', 'background:white;') + } else if (sold_btn.innerHTML == "Confirm?") { + firebase.auth().currentUser.getIdToken().then(function(idToken) { + let item_id = document.getElementById("productID").getAttribute("product_id") + const url = 'sold-api' + let data = {prodID: item_id, authToken: idToken} + let postData = { method: 'POST', body: JSON.stringify(data), headers: {'Content-Type': 'application/json'}} + fetch(url, postData) + .then(response => response.json()) + .then(function(result){ + if (result.success == true) { + sold_btn.setAttribute("style", "background: #00DD00; width:200px;") + sold_btn.innerHTML = "Sold!" + sold_btn.disabled = false + let sale_button = document.getElementById("toggleSaleBtn") + let edit_button = document.getElementById("editBtn") + sale_button.disabled = true + edit_button.disabled = true + } + else { + sold_btn.setAttribute("style", "background: red;") + sold_btn.innerHTML = "ERROR" + document.getElementById("api-response").innerHTML = "Error: " + e + document.getElementById("api-response").setAttribute("style", "display: block") + } + }) + .catch (e=>{ sold_btn.setAttribute("style", "background: red;") sold_btn.innerHTML = "ERROR" document.getElementById("api-response").innerHTML = "Error: " + e document.getElementById("api-response").setAttribute("style", "display: block") - } + }) }) - .catch (e=>{ - sold_btn.setAttribute("style", "background: red;") - sold_btn.innerHTML = "ERROR" - document.getElementById("api-response").innerHTML = "Error: " + e - document.getElementById("api-response").setAttribute("style", "display: block") - }) - }) + } else { + window.location.replace('home') + } + } function my_product(productID) { @@ -400,6 +408,33 @@ function u_r_submit(){ } } +function sendApprove(key) { + sendAR(true, key) +} + +function sendReject(key) { + sendAR(false, key) +} + +function sendAR(approved, prodID) { + let prodElement = document.getElementById(prodID) + firebase.auth().currentUser.getIdToken().then(function(idToken){ + let url = 'product-ar-api' + let data = {authToken: idToken, prodID: prodID, approved:approved} + let postData = {method: 'POST', body: JSON.stringify(data),headers: {'Content-Type': 'application/json'}} + fetch(url, postData) + .then(response => response.json()) + .then(function(result){ + if (result.success) { + prodElement.setAttribute('style', 'display:none;') + } else { + prodElement.setAttribute('style', 'background:red; transition:0.3s;') + console.log(result.error) + } + }) + }) +} + function initFileDropListner() { let dropZone = document.getElementById("dropzone") if (dropZone) { @@ -447,9 +482,52 @@ function fileAddSequence(file){ function contactSeller() { const cBtn = document.getElementById('contact-btn') - cBtn.innerHTML = "Unsupported, contact through product listing" - cBtn.setAttribute('style', "width:410px; transition: 0.7s; background:#FFAAAA; color:gray;") - cBtn.disabled = true + const bMessage = document.getElementById('sMsg') + if (cBtn.innerHTML == "Contact") { + if (firebase.auth().currentUser) { + cBtn.setAttribute("style", "background: #87e5ff; width:410px;") + cBtn.innerHTML = "Send?" + bMessage.setAttribute('style', 'display: block;') + } else { + cBtn.innerHTML = "Please sign in" + cBtn.setAttribute("style", "background: #FFa5af; width:300px;") + } + } + else if (cBtn.innerHTML == "Send?") { + if (firebase.auth().currentUser) { + firebase.auth().currentUser.getIdToken().then(function(idToken) { + cBtn.innerHTML = "Sending..." + cBtn.disabled = true + let userMessage = bMessage.value + let user_dbid = document.getElementById("userDBID").getAttribute("user_dbid") + const url = 'contact-api' + let data = {userDBID: user_dbid, authToken: idToken, usrMsg: userMessage} + let postData = {method: 'POST', body: JSON.stringify(data), headers: {'Content-Type': 'application/json'}} + fetch(url, postData) + .then(response => response.json()) + .then(function(result){ + console.log(result) + if (result.success == true) { + cBtn.setAttribute("style", "background: #00DD00; width:410px; transition: 0.7s;") + cBtn.innerHTML = "Done! Go Home" + cBtn.disabled = false + } + else { + cBtn.setAttribute("style", "background: red;") + cBtn.disabled = true + cBtn.innerHTML = "ERROR" + document.getElementById("api-response").innerHTML = "Error: " + result.error + document.getElementById("api-response").setAttribute("style", "display: block") + } + }) + }) + } else { + reqBtn.innerHTML = "Please sign in" + } + } + else { + window.location.replace('home') + } } try { diff --git a/functions/views/partials/header.ejs b/functions/views/partials/header.ejs index 151b081..a1de85c 100644 --- a/functions/views/partials/header.ejs +++ b/functions/views/partials/header.ejs @@ -38,6 +38,11 @@
+
+ +
🔔 | <%= 0%> diff --git a/functions/views/user-profile.ejs b/functions/views/user-profile.ejs index 1ece229..1760adf 100644 --- a/functions/views/user-profile.ejs +++ b/functions/views/user-profile.ejs @@ -1,11 +1,12 @@ <%- include("partials/header") %> +

<%= user.name %>

-

Member since <%= user.startDate %>

+

Member since <%= user.memberSince %>

Location: <%= user.location %>

Rating: <%= user.rating %>

diff --git a/server.js b/server.js index 7a1f448..ccdf3de 100644 --- a/server.js +++ b/server.js @@ -75,6 +75,28 @@ app.get('/search', function(request, responce){ } }) +app.get('/admin-review', async function(request, responce){ + var dbRef = database.ref("/products") + if (request.query.authToken) { + let uid = await authCheck(request.query.authToken) + if (uid == "If84zSzRvlcCqRs0ZPJRpAcY1He2") { + dbRef.orderByChild("status").equalTo("pending").once('value', function(snapshot){ + if (snapshot.exists()) { + let products = snapshot.val() + responce.render('admin-review.ejs', {products: products}) + } else { + var products = {'x': {name: 'Nothing to review...',price: ''}} + responce.render('admin-review.ejs', {products: products}) + } + }) + } else { + responce.render('404.ejs') + } + } else { + responce.render('404.ejs') + } +}) + app.get('/additmpage', function(request, responce){ responce.render('add-item.ejs') }) @@ -215,7 +237,7 @@ app.get('/user-profile', function(request, responce){ name: user.fName + " " + user.lName, location: user.address, rating: "WIP", - startDate: "WIP", + memberSince: user.memberSince, pPic: user.pPic } productsRef.orderByChild("owner").equalTo(user.UID).once('value', function(snapshot){ @@ -232,9 +254,9 @@ app.get('/user-profile', function(request, responce){ if (Object.keys(filteredProducts).length > 1) {delete filteredProducts["0"]} - responce.render('user-profile.ejs', {userProducts:filteredProducts, user:userProfile}) + responce.render('user-profile.ejs', {userProducts:filteredProducts, user:userProfile, userDBID:request.query.dbid}) } else { - responce.render('user-profile.ejs', {userProducts:[], user:userProfile}) + responce.render('user-profile.ejs', {userProducts:[], user:userProfile, userDBID:request.query.dbid}) } }) .catch(e => { @@ -274,13 +296,17 @@ app.post('/register-new-user-api', async function(request, responce){ let lName = rBody.data.lName let address = rBody.data.address let pPic = rBody.data.pPic + let today = new Date() + let month = today.toLocaleString('default', { month: 'long' }) + let year = today.getFullYear() let uData = { fName:fName, lName:lName, UID:uid, email:email, address:address, - pPic:"x" + pPic:"x", + memberSince: month + " " + year } let usersRef = database.ref('/users') let result = await usersRef.push(uData) @@ -303,6 +329,44 @@ app.post('/register-new-user-api', async function(request, responce){ } }) +app.post('/contact-api', async function(request, responce){ + if (request.body.userDBID && request.body.authToken && request.body.usrMsg) { + let bMsg = request.body.usrMsg + let sellerDBID = request.body.userDBID + let uid = await authCheck(request.body.authToken) + if (uid) { + let usersRef = database.ref("/users") + snapshot = await usersRef.orderByChild("UID").equalTo(uid).once('value') + if (snapshot.exists()) { + let vals = snapshot.val() + let keys = Object.keys(vals) + let user = vals[keys[0]] + let userEmail = user.email + let userName = user.fName + ' ' + user.lName + let sellerRef = database.ref("/users/" + sellerDBID) + snapshot = await sellerRef.once('value') + if (snapshot.exists()) { + let seller = snapshot.val() + let sellerName = seller.fName + let sellerEmail = seller.email + let content = sellerMessageContentMaker(sellerName, userName, userEmail, bMsg) + let subject = 'New message!' + sendEmail(sellerEmail, subject, content) + responce.send({success:true, error:null}) + } else { + responce.send({success:false, error:'User does not exist!'}) + } + } else { + responce.send({success:false, error:'Unregistered user!'}) + } + } else { + responce.send({success:false, error:'invalid auth token'}) + } + } else { + responce.send({success:false, error:'invalid data'}) + } +}) + app.post('/request-api', async function(request, responce){ if (request.body.prodID && request.body.authToken && request.body.usrMsg) { let bMsg = request.body.usrMsg @@ -331,7 +395,8 @@ app.post('/request-api', async function(request, responce){ let buyerName = buyer.fName + ' ' + buyer.lName let buyerEmail = buyer.email let content = contentMaker(sellerName, buyerName, buyerEmail, productName, pid, bMsg) - sendEmail(sellerEmail, content) + let subject = 'Someone\'s interested!' + sendEmail(sellerEmail, subject, content) responce.send({success:true, error:null}) } else { responce.send({success:false, error:'Unregistered user!'}) @@ -360,7 +425,7 @@ app.post('/toggle-sale-api', async function(request, responce){ var snapshot = await productRef.once('value') if (snapshot.exists()) { let product = snapshot.val() - if (await verifyOwner(uid, productID) && product.status != "sold") { + if (await verifyOwner(uid, productID) && (product.status == "on-sale" || product.status == "off-sale")) { let status = "x" if (targetState == true) { status = "on-sale" @@ -455,7 +520,30 @@ app.post('/shipping-adress-edit-api', function(request, responce){ }) } else { - responce.send({error: 'invalid data'}) + responce.send({success:false, error: 'invalid data'}) + } +}) + +app.post('/product-ar-api', async function(request, responce){ + if (request.body.authToken && request.body.prodID && (request.body.approved != null)) { + let uid = await authCheck(request.body.authToken) + if (uid == "If84zSzRvlcCqRs0ZPJRpAcY1He2") { + var productStatus = "rejected" + if (request.body.approved == true) {productStatus = "on-sale"} + productRef = database.ref("/products/" + request.body.prodID) + let snapshot = await productRef.once('value') + if (snapshot.exists()) { + productRef.update({status:productStatus}) + .then(responce.send({success:true, error: null})) + .catch(e=>{responce.send({success:false, error: e})}) + } else { + responce.send({success:false, error: 'Item does not exist'}) + } + } else { + responce.send({success:false, error: 'Unauthorized'}) + } + } else { + responce.send({success:false, error: 'invalid data'}) } }) @@ -495,6 +583,7 @@ app.post('/new-product-api', async function(request, responce){ let image = request.body.image let product = request.body.product let imageName = image.name + product.status = "pending" let newProductRef = database.ref('/products') newProductRef.push(product).then(key => { let productKey = key.key @@ -566,6 +655,11 @@ function contentMaker(sName, bName, bEmail, pName, pid, bMsg){ return text } +function sellerMessageContentMaker(sName, bName, bEmail, bMsg){ + let text = "Hi " + sName + "\n \n" + bName + " would like to send you a message.\n\nUser email: " + bEmail +"\n\nMessage:\n" + bMsg + return text +} + async function authCheck(token) { let uid = false decodedToken = await admin.auth().verifyIdToken(token).catch(e=>{console.log(e)}) @@ -619,11 +713,11 @@ async function verifyOwner(uid, pid) { } } -function sendEmail(address, content){ +function sendEmail(address, subject, content){ var mailOptions = { from: 'Project GG', to: address, - subject: 'Someone\'s interested!', + subject: subject, text: content } transporter.sendMail(mailOptions, function(error, info){