From cb69e20e3b7e96670eba78e4fb459272aefdd480 Mon Sep 17 00:00:00 2001 From: Max Hunt Date: Sun, 17 May 2020 00:09:20 +0100 Subject: [PATCH] Update --- functions/index.js | 79 ++++++++++++++++++++++++-------- functions/views/css/style.css | 6 +-- functions/views/js/fdb.js | 2 +- functions/views/js/fdb.src.js | 7 +++ functions/views/product.ejs | 2 +- functions/views/user-profile.ejs | 37 +++++++++++++++ server.js | 79 ++++++++++++++++++++++++-------- 7 files changed, 169 insertions(+), 43 deletions(-) create mode 100644 functions/views/user-profile.ejs diff --git a/functions/index.js b/functions/index.js index c264d01..575b0b1 100644 --- a/functions/index.js +++ b/functions/index.js @@ -53,25 +53,16 @@ app.get('/search', function(request, responce){ if (request.query.search) { let sQuery = request.query.search.toLowerCase() dbRef.orderByChild("status").equalTo("on-sale").once('value', function(snapshot){ - var data = { - 'x': {desc: '',holder: '',id: 999,img: '',location: '',name: 'Nothing found 😢',owner: '',price: '',public: '',stock: ''}, - } + var data = {'x': {name: 'Nothing found 😢',price: ''}} if (snapshot.val()) { data = snapshot.val() - var sResults = [{desc: '',holder: '',id: 999,img: '',location: '',name: 'Nothing found 😢',owner: '',price: '',public: '',stock: ''}] + var sResults = [{name: 'Nothing found 😢',price: ''}] var keys = Object.keys(data) - keys.forEach(key => { - if (data[key].name.toLowerCase().includes(sQuery) || data[key].desc.toLowerCase().includes(sQuery)) { - sResults[key] = data[key] - console.log(sResults) - } + if (data[key].name.toLowerCase().includes(sQuery) || data[key].desc.toLowerCase().includes(sQuery)) {sResults[key] = data[key]} }) - if (Object.keys(sResults).length > 1) { - delete sResults[0] - } - console.log(sResults) + if (Object.keys(sResults).length > 1) {delete sResults[0]} responce.render('search.ejs', {products: sResults}) } else {responce.render('search.ejs', {products: data})} @@ -79,9 +70,7 @@ app.get('/search', function(request, responce){ } else { dbRef.orderByChild("status").equalTo("on-sale").once('value', function(snapshot){ - var data = { - 'x': {desc: '',holder: '',id: 999,img: '',location: '',name: 'Nothing found 😢',owner: '',price: '',public: '',stock: ''}, - } + var data = {'x': {name: 'Nothing found 😢',price: ''}} if (snapshot.val()) {data = snapshot.val()} responce.render('search.ejs', {products: data}) }) @@ -202,7 +191,8 @@ app.get('/product', function(request, responce){ var keys = Object.keys(vals) uData = vals[keys[0]] sellerName = uData.fName + " " + uData.lName - responce.render('product.ejs', {item:data, key:request.query.productid, seller:sellerName}) + sellerDBID = keys[0] + responce.render('product.ejs', {item:data, key:request.query.productid, seller:{name:sellerName, dbid:sellerDBID}}) }) .catch(e => {console.log(e)}) } @@ -216,6 +206,58 @@ app.get('/product', function(request, responce){ } }) +app.get('/user-profile', function(request, responce){ + if (request.query.dbid) { + var dbRef = database.ref("/users/" + request.query.dbid) + dbRef.once('value', function(snapshot){ + user = snapshot.val() + if (user){ + let productsRef = database.ref("/products") + let userProfile = { + name: user.fName + " " + user.lName, + location: user.address, + rating: "WIP", + startDate: "WIP", + pPic: user.pPic + } + productsRef.orderByChild("owner").equalTo(user.UID).once('value', function(snapshot){ + if (snapshot.exists()) { + let allProductsDict = snapshot.val() + let allProductsKeys = Object.keys(allProductsDict) + + let filteredKeys = allProductsKeys.filter(function( obj ) { + return allProductsDict[obj].status == 'on-sale'; + }) + let filteredProducts = {"0":{img: '',name: 'Nothing listed 😢',price: ''}} + + filteredKeys.forEach(function(key){filteredProducts[key] = allProductsDict[key]}) + + if (Object.keys(filteredProducts).length > 1) {delete filteredProducts["0"]} + + responce.render('user-profile.ejs', {userProducts:filteredProducts, user:userProfile}) + } else { + responce.render('user-profile.ejs', {userProducts:[], user:userProfile}) + } + }) + .catch(e => { + console.log(e) + responce.render('404.ejs') + }) + } + else { + responce.render('404.ejs') + } + }) + .catch(e => { + console.log(e) + responce.render('404.ejs') + }) + } + else { + responce.render('404.ejs') + } +}) + app.get('/registration', function(request, responce){ responce.render('user-registration.ejs') }) @@ -291,8 +333,7 @@ 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) - let rsp = sendEmail(sellerEmail, content) - console.log(rsp) + sendEmail(sellerEmail, content) responce.send({success:true, error:null}) } else { responce.send({success:false, error:'Unregistered user!'}) diff --git a/functions/views/css/style.css b/functions/views/css/style.css index ac35bb9..46fb46d 100644 --- a/functions/views/css/style.css +++ b/functions/views/css/style.css @@ -846,8 +846,8 @@ input:focus, textarea:focus, select:focus{ width: 100%; height: 100%; } - -@media (prefers-color-scheme: dark) { +/* DARK MODE SUPPORT: */ +/* @media (prefers-color-scheme: dark) { body, .page, main, .navbar { background: #222222; } @@ -855,4 +855,4 @@ input:focus, textarea:focus, select:focus{ background: rgb(20, 20, 20); box-shadow: none; } -} \ No newline at end of file +} */ \ No newline at end of file diff --git a/functions/views/js/fdb.js b/functions/views/js/fdb.js index 79cb85f..a134d1c 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 u=i.files[0],c={name:i.files[0].name,b64:null};firebase.auth().currentUser.getIdToken().then(function(n){let d={authToken:n,product:t,image:c},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(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!",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"),u=l.files[0].name,c=l.files[0],a={authToken:t,data:{fName:o,lName:s,address:i,pPic:u}},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(c).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")}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:"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 diff --git a/functions/views/js/fdb.src.js b/functions/views/js/fdb.src.js index 9895099..c9685f6 100644 --- a/functions/views/js/fdb.src.js +++ b/functions/views/js/fdb.src.js @@ -445,6 +445,13 @@ 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 +} + try { var addressField = document.getElementById("shippingaddressinput") addressField.addEventListener("keyup", function(event) { diff --git a/functions/views/product.ejs b/functions/views/product.ejs index 5c00d38..f4e1a9c 100644 --- a/functions/views/product.ejs +++ b/functions/views/product.ejs @@ -7,7 +7,7 @@

<%= item.name %>

-

Seller: <%= seller %>

+

Seller: <%= seller.name %>

Location: <%= item.location %>

Quantity: <%= item.stock %>

Price: £<%= item.price %>

diff --git a/functions/views/user-profile.ejs b/functions/views/user-profile.ejs new file mode 100644 index 0000000..1ece229 --- /dev/null +++ b/functions/views/user-profile.ejs @@ -0,0 +1,37 @@ +<%- include("partials/header") %> + +
+
+
+
+

<%= user.name %>

+

Member since <%= user.startDate %>

+

Location: <%= user.location %>

+

Rating: <%= user.rating %>

+

+ + +
+
+
+

Products on sale

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

<%= userProducts[key].name%>

+

+

+

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

+
+
+ <% }) %> +
+
+
+
+
+ +<%- include("partials/footer") %> \ No newline at end of file diff --git a/server.js b/server.js index be0449e..7a1f448 100644 --- a/server.js +++ b/server.js @@ -51,25 +51,16 @@ app.get('/search', function(request, responce){ if (request.query.search) { let sQuery = request.query.search.toLowerCase() dbRef.orderByChild("status").equalTo("on-sale").once('value', function(snapshot){ - var data = { - 'x': {desc: '',holder: '',id: 999,img: '',location: '',name: 'Nothing found 😢',owner: '',price: '',public: '',stock: ''}, - } + var data = {'x': {name: 'Nothing found 😢',price: ''}} if (snapshot.val()) { data = snapshot.val() - var sResults = [{desc: '',holder: '',id: 999,img: '',location: '',name: 'Nothing found 😢',owner: '',price: '',public: '',stock: ''}] + var sResults = [{name: 'Nothing found 😢',price: ''}] var keys = Object.keys(data) - keys.forEach(key => { - if (data[key].name.toLowerCase().includes(sQuery) || data[key].desc.toLowerCase().includes(sQuery)) { - sResults[key] = data[key] - console.log(sResults) - } + if (data[key].name.toLowerCase().includes(sQuery) || data[key].desc.toLowerCase().includes(sQuery)) {sResults[key] = data[key]} }) - if (Object.keys(sResults).length > 1) { - delete sResults[0] - } - console.log(sResults) + if (Object.keys(sResults).length > 1) {delete sResults[0]} responce.render('search.ejs', {products: sResults}) } else {responce.render('search.ejs', {products: data})} @@ -77,9 +68,7 @@ app.get('/search', function(request, responce){ } else { dbRef.orderByChild("status").equalTo("on-sale").once('value', function(snapshot){ - var data = { - 'x': {desc: '',holder: '',id: 999,img: '',location: '',name: 'Nothing found 😢',owner: '',price: '',public: '',stock: ''}, - } + var data = {'x': {name: 'Nothing found 😢',price: ''}} if (snapshot.val()) {data = snapshot.val()} responce.render('search.ejs', {products: data}) }) @@ -200,7 +189,8 @@ app.get('/product', function(request, responce){ var keys = Object.keys(vals) uData = vals[keys[0]] sellerName = uData.fName + " " + uData.lName - responce.render('product.ejs', {item:data, key:request.query.productid, seller:sellerName}) + sellerDBID = keys[0] + responce.render('product.ejs', {item:data, key:request.query.productid, seller:{name:sellerName, dbid:sellerDBID}}) }) .catch(e => {console.log(e)}) } @@ -214,6 +204,58 @@ app.get('/product', function(request, responce){ } }) +app.get('/user-profile', function(request, responce){ + if (request.query.dbid) { + var dbRef = database.ref("/users/" + request.query.dbid) + dbRef.once('value', function(snapshot){ + user = snapshot.val() + if (user){ + let productsRef = database.ref("/products") + let userProfile = { + name: user.fName + " " + user.lName, + location: user.address, + rating: "WIP", + startDate: "WIP", + pPic: user.pPic + } + productsRef.orderByChild("owner").equalTo(user.UID).once('value', function(snapshot){ + if (snapshot.exists()) { + let allProductsDict = snapshot.val() + let allProductsKeys = Object.keys(allProductsDict) + + let filteredKeys = allProductsKeys.filter(function( obj ) { + return allProductsDict[obj].status == 'on-sale'; + }) + let filteredProducts = {"0":{img: '',name: 'Nothing listed 😢',price: ''}} + + filteredKeys.forEach(function(key){filteredProducts[key] = allProductsDict[key]}) + + if (Object.keys(filteredProducts).length > 1) {delete filteredProducts["0"]} + + responce.render('user-profile.ejs', {userProducts:filteredProducts, user:userProfile}) + } else { + responce.render('user-profile.ejs', {userProducts:[], user:userProfile}) + } + }) + .catch(e => { + console.log(e) + responce.render('404.ejs') + }) + } + else { + responce.render('404.ejs') + } + }) + .catch(e => { + console.log(e) + responce.render('404.ejs') + }) + } + else { + responce.render('404.ejs') + } +}) + app.get('/registration', function(request, responce){ responce.render('user-registration.ejs') }) @@ -289,8 +331,7 @@ 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) - let rsp = sendEmail(sellerEmail, content) - console.log(rsp) + sendEmail(sellerEmail, content) responce.send({success:true, error:null}) } else { responce.send({success:false, error:'Unregistered user!'})