items & settings
built buying limiteds & selling limiteds. also buying from other users. also added changing passwords and emails.
This commit is contained in:
parent
a7690eada2
commit
ae22ea9d5f
|
|
@ -6,6 +6,7 @@ use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Hash;
|
use Illuminate\Support\Facades\Hash;
|
||||||
use Illuminate\Support\Facades\Validator;
|
use Illuminate\Support\Facades\Validator;
|
||||||
use App\Helpers\AuthHelper;
|
use App\Helpers\AuthHelper;
|
||||||
|
use Auth;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
|
|
||||||
class AuthController extends Controller
|
class AuthController extends Controller
|
||||||
|
|
@ -96,7 +97,7 @@ class AuthController extends Controller
|
||||||
if (!$user)
|
if (!$user)
|
||||||
return Response()->json(['message'=>'That user doesn\'t exist.', 'badInputs'=>['username']]);
|
return Response()->json(['message'=>'That user doesn\'t exist.', 'badInputs'=>['username']]);
|
||||||
|
|
||||||
if (Hash::check($request->input('password'), $user->password))
|
if (!Hash::check($request->input('password'), $user->password))
|
||||||
return Response()->json(['message'=>'The password you tried is incorrect.', 'badInputs'=>['password']]);
|
return Response()->json(['message'=>'The password you tried is incorrect.', 'badInputs'=>['password']]);
|
||||||
|
|
||||||
$request->session()->regenerate();
|
$request->session()->regenerate();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,246 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Providers\RouteServiceProvider;
|
||||||
|
use App\Models\User;
|
||||||
|
use App\Models\User\UserSession;
|
||||||
|
use App\Models\Post;
|
||||||
|
use App\Models\Reply;
|
||||||
|
use App\Models\Category;
|
||||||
|
use App\Models\Friend;
|
||||||
|
use App\Models\Feed;
|
||||||
|
use App\Models\Item;
|
||||||
|
use App\Models\Selling;
|
||||||
|
use App\Models\Inventory;
|
||||||
|
use App\Models\Staff;
|
||||||
|
use App\Models\Prices;
|
||||||
|
use Illuminate\Foundation\Auth\RegistersUsers;
|
||||||
|
use Illuminate\Support\Facades\Hash;
|
||||||
|
use Illuminate\Support\Facades\Validator;
|
||||||
|
use App\Helpers\AuthHelper;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Auth;
|
||||||
|
|
||||||
|
class CatalogController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create a new controller instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
/*public function __construct()
|
||||||
|
{
|
||||||
|
$this->middleware('auth');
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the application dashboard.
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Contracts\Support\Renderable
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view('home');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function buy(Request $request, $id) {
|
||||||
|
|
||||||
|
$user = AuthHelper::GetCurrentUser($request);
|
||||||
|
|
||||||
|
if (!$user) return Response()->json(['message'=>'System Error', 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
$item = Item::whereId($id)->first();
|
||||||
|
|
||||||
|
if (!$item) return Response()->json(['message'=>'No Item.', 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
if (!isset($_POST['decision'])) return Response()->json(['message'=>'System Error', 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
$decision = $_POST['decision'];
|
||||||
|
|
||||||
|
if ($item->current_price > $user->bank) return Response()->json(['message'=>"Sorry, you don't have enough currency!", 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
switch($decision) {
|
||||||
|
case 'nonLimited':
|
||||||
|
|
||||||
|
$newInventory = new Inventory;
|
||||||
|
$newInventory->item_id = $item->id;
|
||||||
|
$newInventory->owner_id = $user->id;
|
||||||
|
$newInventory->owner_type = 'App\Models\User';
|
||||||
|
$newInventory->status = 1;
|
||||||
|
$user->inventory()->save($newInventory);
|
||||||
|
$newInventory->uid = 'nonLimited';
|
||||||
|
$newInventory->save();
|
||||||
|
|
||||||
|
$user->decrement('bank', $item->current_price);
|
||||||
|
$user->save();
|
||||||
|
|
||||||
|
$replies = $item->sellingPrices()->orderBy('price', 'asc')->paginate(10);
|
||||||
|
|
||||||
|
$itemA = $item->toArray();
|
||||||
|
|
||||||
|
$itemA['creator'] = User::where('id', $item->creator_id)->first();
|
||||||
|
|
||||||
|
foreach ($replies as &$reply) {
|
||||||
|
$creator = User::where('id', $reply['seller_id'])->first();
|
||||||
|
$reply['created_at'] = explode('T', $reply['created_at'])[0];
|
||||||
|
$reply['seller_name'] = $creator->username;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response()->json(['message'=>"Success!", 'badInputs'=>[], "item"=>$itemA, "sellingPrices"=>$replies]);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'limited':
|
||||||
|
|
||||||
|
if ($item->stock <= 0) return Response()->json(['message'=>"Sorry, there's no more in stock for this item!", 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
$newInventory = new Inventory;
|
||||||
|
$newInventory->item_id = $item->id;
|
||||||
|
$newInventory->owner_id = $user->id;
|
||||||
|
$newInventory->owner_type = 'App\Models\User';
|
||||||
|
$newInventory->status = 1;
|
||||||
|
$user->inventory()->save($newInventory);
|
||||||
|
$newInventory->uid = $newInventory->id;
|
||||||
|
$newInventory->save();
|
||||||
|
|
||||||
|
$user->decrement('bank', $item->current_price);
|
||||||
|
$user->save();
|
||||||
|
|
||||||
|
$item->decrement('stock');
|
||||||
|
$item->save();
|
||||||
|
|
||||||
|
$replies = $item->sellingPrices()->orderBy('price', 'asc')->paginate(10);
|
||||||
|
|
||||||
|
$itemA = $item->toArray();
|
||||||
|
|
||||||
|
$itemA['creator'] = User::where('id', $item->creator_id)->first();
|
||||||
|
|
||||||
|
foreach ($replies as &$reply) {
|
||||||
|
$creator = User::where('id', $reply['seller_id'])->first();
|
||||||
|
$reply['created_at'] = explode('T', $reply['created_at'])[0];
|
||||||
|
$reply['seller_name'] = $creator->username;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response()->json(['message'=>"Success!", 'badInputs'=>[], "item"=>$itemA, "sellingPrices"=>$replies]);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'selling':
|
||||||
|
|
||||||
|
if (!isset($_POST['sellingId'])) return Response()->json(['message'=>'No Selling ID.', 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
$sellingId = $_POST['sellingId'];
|
||||||
|
|
||||||
|
$sellingItem = Selling::whereId($sellingId)->first();
|
||||||
|
|
||||||
|
if (!$sellingItem) return Response()->json(['message'=>"That selling item doesn't exist!", 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
if ($sellingItem->seller_id == $user->id) return Response()->json(['message'=>"Thats you!", 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
$seller = User::where('id', $sellingItem->seller_id)->first();
|
||||||
|
|
||||||
|
$ownedItem = Inventory::where('owner_id', $sellingItem->seller_id)->where('item_id', $item->id)->first();
|
||||||
|
|
||||||
|
if ($sellingItem->price > $user->bank) return Response()->json(['message'=>"Sorry, you don't have enough currency!", 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
$newInventory = new Inventory;
|
||||||
|
$newInventory->item_id = $item->id;
|
||||||
|
$newInventory->owner_id = $user->id;
|
||||||
|
$newInventory->owner_type = 'App\Models\User';
|
||||||
|
$newInventory->status = 1;
|
||||||
|
$user->inventory()->save($newInventory);
|
||||||
|
$newInventory->uid = $sellingItem->uid;
|
||||||
|
$newInventory->save();
|
||||||
|
|
||||||
|
$user->decrement('bank', $sellingItem->price);
|
||||||
|
$user->save();
|
||||||
|
|
||||||
|
$seller->increment('bank', $sellingItem->price);
|
||||||
|
$seller->save();
|
||||||
|
|
||||||
|
/*$priceNew = new Prices;
|
||||||
|
$priceNew->price = $sellingItem->price;
|
||||||
|
$item->prices()->save($priceNew);*/
|
||||||
|
|
||||||
|
$sellingItem->delete();
|
||||||
|
|
||||||
|
$ownedItem->delete();
|
||||||
|
|
||||||
|
$sellingItemNew = Selling::whereId($sellingId)->first();
|
||||||
|
|
||||||
|
if (count($item->sellingPrices) <= 0) {$item->current_price = null;$item->save();}else{$item->current_price = $sellingItemNew->price;$item->save();}
|
||||||
|
|
||||||
|
$replies = $item->sellingPrices()->orderBy('price', 'asc')->paginate(10);
|
||||||
|
|
||||||
|
$itemA = $item->toArray();
|
||||||
|
|
||||||
|
$itemA['creator'] = User::where('id', $item->creator_id)->first();
|
||||||
|
|
||||||
|
foreach ($replies as &$reply) {
|
||||||
|
$creator = User::where('id', $reply['seller_id'])->first();
|
||||||
|
$reply['created_at'] = explode('T', $reply['created_at'])[0];
|
||||||
|
$reply['seller_name'] = $creator->username;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response()->json(['message'=>"Success!", 'badInputs'=>[], "item"=>$itemA, "sellingPrices"=>$replies]);
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function sell(Request $request, $id) {
|
||||||
|
|
||||||
|
$user = AuthHelper::GetCurrentUser($request);
|
||||||
|
|
||||||
|
if (!$user) return Response()->json(['message'=>'System Error', 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
$item = Item::whereId($id)->first();
|
||||||
|
|
||||||
|
if (!$item) return Response()->json(['message'=>'System Error', 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
if (!$user->ownsItem($id)) return Response()->json(['message'=>"You don't own this item!", 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
$inventory = Inventory::where('item_id', $id)->where('owner_id', $user->id)->first();
|
||||||
|
|
||||||
|
$data = $request->all();
|
||||||
|
|
||||||
|
$valid = Validator::make($data, [
|
||||||
|
'price' => ['required', 'integer', 'min:1'],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($valid->stopOnFirstFailure()->fails()) {
|
||||||
|
$error = $valid->errors()->first();
|
||||||
|
$messages = $valid->messages()->get('*');
|
||||||
|
return Response()->json(['message'=>$error, 'badInputs'=>[array_keys($messages)]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$selling = new Selling;
|
||||||
|
$selling->seller_id = $user->id;
|
||||||
|
$selling->uid = $inventory->uid;
|
||||||
|
$selling->price = $request->input('price');
|
||||||
|
$item->sellingPrices()->save($selling);
|
||||||
|
|
||||||
|
$sellingItemNew = Selling::where('item_id', $id)->first();
|
||||||
|
|
||||||
|
if ($item->sellingPrices()->count() <= 0) {$item->current_price = null;$item->save();}else{$item->current_price = $sellingItemNew->price;$item->save();}
|
||||||
|
|
||||||
|
$replies = $item->sellingPrices()->orderBy('price', 'asc')->paginate(10);
|
||||||
|
|
||||||
|
$itemA = $item->toArray();
|
||||||
|
|
||||||
|
$itemA['creator'] = User::where('id', $item->creator_id)->first();
|
||||||
|
|
||||||
|
foreach ($replies as &$reply) {
|
||||||
|
$creator = User::where('id', $reply['seller_id'])->first();
|
||||||
|
$reply['created_at'] = explode('T', $reply['created_at'])[0];
|
||||||
|
$reply['seller_name'] = $creator->username;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response()->json(['message'=>"Success!", 'badInputs'=>[], "item"=>$itemA, "sellingPrices"=>$replies]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -18,6 +18,7 @@ use App\Models\Friend;
|
||||||
use App\Models\Feed;
|
use App\Models\Feed;
|
||||||
use App\Models\Item;
|
use App\Models\Item;
|
||||||
use App\Models\Inventory;
|
use App\Models\Inventory;
|
||||||
|
use App\Models\Selling;
|
||||||
use Illuminate\Foundation\Auth\RegistersUsers;
|
use Illuminate\Foundation\Auth\RegistersUsers;
|
||||||
use Illuminate\Support\Facades\Hash;
|
use Illuminate\Support\Facades\Hash;
|
||||||
use Illuminate\Support\Facades\Validator;
|
use Illuminate\Support\Facades\Validator;
|
||||||
|
|
@ -160,4 +161,45 @@ class Controller extends BaseController
|
||||||
|
|
||||||
return Response()->json(["post"=>$postA,"replies"=>$replies]);
|
return Response()->json(["post"=>$postA,"replies"=>$replies]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function fetchItem(Request $request, $id) {
|
||||||
|
|
||||||
|
$user = AuthHelper::GetCurrentUser($request);
|
||||||
|
|
||||||
|
$item = Item::where('id', $id)->first();
|
||||||
|
|
||||||
|
if (!$item) return Response()->json(false);
|
||||||
|
|
||||||
|
$itemA = $item->toArray();
|
||||||
|
|
||||||
|
$realDate = explode('T', $itemA['created_at'])[0];
|
||||||
|
|
||||||
|
$itemA['created_at'] = $realDate;
|
||||||
|
|
||||||
|
$itemA['creator'] = User::where('id', $item->creator_id)->first();
|
||||||
|
|
||||||
|
if ($user) {
|
||||||
|
$sellingItem = Selling::where('seller_id', $user->id)->first();
|
||||||
|
if ($sellingItem) {
|
||||||
|
$itemA['isSelling'] = true;
|
||||||
|
} else {
|
||||||
|
$itemA['isSelling'] = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$itemA['isSelling'] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($user && $user->ownsItem($id)) {$itemA['ownsItem'] = true;}else{$itemA['ownsItem'] = false;}
|
||||||
|
|
||||||
|
$replies = $item->sellingPrices()->orderBy('price', 'asc')->paginate(10);
|
||||||
|
|
||||||
|
foreach ($replies as &$reply) {
|
||||||
|
$creator = User::where('id', $reply['seller_id'])->first();
|
||||||
|
$reply['created_at'] = explode('T', $reply['created_at'])[0];
|
||||||
|
$reply['seller_name'] = $creator->username;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Response()->json(["item"=>$itemA,"sellingPrices"=>$replies]);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,29 +41,6 @@ class HomeController extends Controller
|
||||||
return view('home');
|
return view('home');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function settingsAbout(Request $request) {
|
|
||||||
|
|
||||||
$data = $request->all();
|
|
||||||
|
|
||||||
$valid = Validator::make($data, [
|
|
||||||
'body' => ['required', 'string', 'min:2', 'max:180'],
|
|
||||||
]);
|
|
||||||
|
|
||||||
if ($valid->stopOnFirstFailure()->fails()) {
|
|
||||||
$error = $valid->errors()->first();
|
|
||||||
$messages = $valid->messages()->get('*');
|
|
||||||
return Response()->json(['message'=>$error, 'badInputs'=>[array_keys($messages)]]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$user = AuthHelper::GetCurrentUser($request);
|
|
||||||
|
|
||||||
$user->about = $_POST['body'];
|
|
||||||
$user->save();
|
|
||||||
|
|
||||||
return Response()->json(['message'=>'Success!', 'badInputs'=>[]]);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public function createPost(Request $request) {
|
public function createPost(Request $request) {
|
||||||
|
|
||||||
$data = $request->all();
|
$data = $request->all();
|
||||||
|
|
@ -206,7 +183,7 @@ class HomeController extends Controller
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function createReply($id) {
|
public function createReply(Request $request, $id) {
|
||||||
|
|
||||||
$data = $request->all();
|
$data = $request->all();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,130 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Providers\RouteServiceProvider;
|
||||||
|
use App\Models\User;
|
||||||
|
use App\Models\User\UserSession;
|
||||||
|
use App\Models\Post;
|
||||||
|
use App\Models\Reply;
|
||||||
|
use App\Models\Category;
|
||||||
|
use App\Models\Friend;
|
||||||
|
use App\Models\Feed;
|
||||||
|
use App\Models\Staff;
|
||||||
|
use Illuminate\Foundation\Auth\RegistersUsers;
|
||||||
|
use Illuminate\Support\Facades\Hash;
|
||||||
|
use Illuminate\Support\Facades\Validator;
|
||||||
|
use App\Helpers\AuthHelper;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Auth;
|
||||||
|
|
||||||
|
class SettingsController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create a new controller instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
/*public function __construct()
|
||||||
|
{
|
||||||
|
$this->middleware('auth');
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the application dashboard.
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Contracts\Support\Renderable
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return view('home');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function settingsAbout(Request $request) {
|
||||||
|
|
||||||
|
$data = $request->all();
|
||||||
|
|
||||||
|
$valid = Validator::make($data, [
|
||||||
|
'body' => ['required', 'string', 'min:2', 'max:180'],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($valid->stopOnFirstFailure()->fails()) {
|
||||||
|
$error = $valid->errors()->first();
|
||||||
|
$messages = $valid->messages()->get('*');
|
||||||
|
return Response()->json(['message'=>$error, 'badInputs'=>[array_keys($messages)]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = AuthHelper::GetCurrentUser($request);
|
||||||
|
|
||||||
|
$user->about = $_POST['body'];
|
||||||
|
$user->save();
|
||||||
|
|
||||||
|
return Response()->json(['message'=>'Success!', 'badInputs'=>[]]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function settingsPassword(Request $request) {
|
||||||
|
|
||||||
|
$data = $request->all();
|
||||||
|
|
||||||
|
$valid = Validator::make($data, [
|
||||||
|
'currentPassword' => ['required', 'string'],
|
||||||
|
'newPassword' => ['required', 'string', 'min:8'],
|
||||||
|
'checkNewPassword' => ['required', 'string'],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($valid->stopOnFirstFailure()->fails()) {
|
||||||
|
$error = $valid->errors()->first();
|
||||||
|
$messages = $valid->messages()->get('*');
|
||||||
|
return Response()->json(['message'=>$error, 'badInputs'=>[array_keys($messages)]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = AuthHelper::GetCurrentUser($request);
|
||||||
|
|
||||||
|
if (!$user) return Response()->json(['message'=>'User not found!', 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
if (!Hash::check($request->input('currentPassword'), $user->password))
|
||||||
|
return Response()->json(['message'=>'Thats not the right password!', 'badInputs'=>['currentPassword']]);
|
||||||
|
|
||||||
|
if ($request->input('newPassword') != $request->input('checkNewPassword'))
|
||||||
|
return Response()->json(['message'=>'Those dont match!', 'badInputs'=>['checkNewPassword', 'newPassword']]);
|
||||||
|
|
||||||
|
$user->password = Hash::make($request->input('newPassword'));
|
||||||
|
$user->save();
|
||||||
|
|
||||||
|
return Response()->json(['message'=>'Success!', 'badInputs'=>[]]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function settingsEmail(Request $request) {
|
||||||
|
|
||||||
|
$data = $request->all();
|
||||||
|
|
||||||
|
$valid = Validator::make($data, [
|
||||||
|
'currentPassword' => ['required', 'string'],
|
||||||
|
'newEmail' => ['required', 'string', 'email', 'max:255'],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($valid->stopOnFirstFailure()->fails()) {
|
||||||
|
$error = $valid->errors()->first();
|
||||||
|
$messages = $valid->messages()->get('*');
|
||||||
|
return Response()->json(['message'=>$error, 'badInputs'=>[array_keys($messages)]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = AuthHelper::GetCurrentUser($request);
|
||||||
|
|
||||||
|
if (!$user) return Response()->json(['message'=>'User not found!', 'badInputs'=>['title']]);
|
||||||
|
|
||||||
|
if (!Hash::check($request->input('currentPassword'), $user->password))
|
||||||
|
return Response()->json(['message'=>'Thats not the right password!', 'badInputs'=>['currentPassword']]);
|
||||||
|
|
||||||
|
$user->email = $request->input('newEmail');
|
||||||
|
$user->email_verified_at = null;
|
||||||
|
$user->save();
|
||||||
|
|
||||||
|
return Response()->json(['message'=>'Success!', 'badInputs'=>[]]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -12,4 +12,14 @@ class Item extends Model
|
||||||
|
|
||||||
protected $table = 'items';
|
protected $table = 'items';
|
||||||
|
|
||||||
|
function sellingPrices()
|
||||||
|
{
|
||||||
|
return $this->morphMany('App\Models\Selling', 'item');
|
||||||
|
}
|
||||||
|
|
||||||
|
function prices()
|
||||||
|
{
|
||||||
|
return $this->morphMany('App\Models\Price', 'item');
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class Prices extends Model
|
||||||
|
{
|
||||||
|
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
|
protected $table = 'prices';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class Selling extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
|
protected $table = 'sellings';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -23,6 +23,17 @@ class User extends Model
|
||||||
'email_verified_at'
|
'email_verified_at'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
function inventory()
|
||||||
|
{
|
||||||
|
return $this->morphMany('App\Models\Inventory', 'owner');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function ownsItem($id)
|
||||||
|
{
|
||||||
|
$ownedItem = Inventory::where('item_id', $id)->where('owner_id', $this->id)->first();
|
||||||
|
if ($ownedItem) {return true;}else{return false;}
|
||||||
|
}
|
||||||
|
|
||||||
public function getFriends($decision, $pending, $id) {
|
public function getFriends($decision, $pending, $id) {
|
||||||
|
|
||||||
switch($decision) {
|
switch($decision) {
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,11 @@ class CreateItemsTable extends Migration
|
||||||
$table->string('thumbnail');
|
$table->string('thumbnail');
|
||||||
$table->integer('creator_id');
|
$table->integer('creator_id');
|
||||||
$table->integer('starting_price')->default(5);
|
$table->integer('starting_price')->default(5);
|
||||||
$table->integer('current_price')->default(5);
|
$table->integer('current_price')->default(5)->nullable();
|
||||||
$table->integer('category_id')->default(1);
|
$table->integer('category_id')->default(1);
|
||||||
$table->string('category_type');
|
$table->string('category_type');
|
||||||
|
$table->integer('isLimited')->default(0);
|
||||||
|
$table->integer('stock')->nullable(); //default is null because most items won't be limiteds.
|
||||||
//may need to add more later idk.
|
//may need to add more later idk.
|
||||||
$table->timestamps();
|
$table->timestamps();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ class CreateInventoriesTable extends Migration
|
||||||
$table->string('item_id');
|
$table->string('item_id');
|
||||||
$table->string('owner_id');
|
$table->string('owner_id');
|
||||||
$table->string('owner_type');
|
$table->string('owner_type');
|
||||||
$table->string('uid'); //unique id | used for limiteds, the original id of the inventory row. once set, it never changes
|
$table->string('uid')->nullable(); //unique id | used for limiteds, the original id of the inventory row. once set, it never changes
|
||||||
$table->boolean('status')->default(true);
|
$table->boolean('status')->default(true);
|
||||||
$table->timestamps();
|
$table->timestamps();
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class CreateSellingsTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::create('sellings', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->integer('seller_id');
|
||||||
|
$table->integer('item_id');
|
||||||
|
$table->string('item_type');
|
||||||
|
$table->integer('uid')->nullable(); //unique id | used for limiteds, the original id of the inventory row. once set, it never changes
|
||||||
|
$table->integer('price');
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('sellings');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class CreatePricesTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::create('prices', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->string('item_id');
|
||||||
|
$table->string('item_type');
|
||||||
|
$table->string('price');
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('prices');
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -13,7 +13,7 @@
|
||||||
"@babel/preset-react": "^7.13.13",
|
"@babel/preset-react": "^7.13.13",
|
||||||
"@popperjs/core": "^2.9.2",
|
"@popperjs/core": "^2.9.2",
|
||||||
"axios": "^0.21",
|
"axios": "^0.21",
|
||||||
"bootstrap": "5.0.1",
|
"bootstrap": "^5.1.3",
|
||||||
"css-loader": "^6.4.0",
|
"css-loader": "^6.4.0",
|
||||||
"jquery": "^3.6.0",
|
"jquery": "^3.6.0",
|
||||||
"laravel-mix": "^6.0.6",
|
"laravel-mix": "^6.0.6",
|
||||||
|
|
@ -38,7 +38,7 @@
|
||||||
"@steveeeie/react-page-transition": "^1.2.1",
|
"@steveeeie/react-page-transition": "^1.2.1",
|
||||||
"laravel-mix-react-css-modules": "^2.0.0",
|
"laravel-mix-react-css-modules": "^2.0.0",
|
||||||
"mini-css-extract-plugin": "^2.4.3",
|
"mini-css-extract-plugin": "^2.4.3",
|
||||||
"react-bootstrap": "^2.0.2",
|
"react-bootstrap": "^2.2.2",
|
||||||
"react-google-recaptcha": "^2.1.0",
|
"react-google-recaptcha": "^2.1.0",
|
||||||
"react-router-guards": "^1.0.2",
|
"react-router-guards": "^1.0.2",
|
||||||
"styled-components": "^5.3.1",
|
"styled-components": "^5.3.1",
|
||||||
|
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
|
|
@ -16,6 +16,18 @@ export const Card = (props) => {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const BigCard = (props) => {
|
||||||
|
return (
|
||||||
|
<div className="container graphictoria-center-vh">
|
||||||
|
<div className={`card shadow-sm ${props.className}`}>
|
||||||
|
<div className={`card-body ${props.padding? `p5r` : null} text-center`}>
|
||||||
|
{ props.children }
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export const CardTitle = (props) => {
|
export const CardTitle = (props) => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ import CreateReply from '../pages/CreateReply.js';
|
||||||
import Settings from '../pages/Settings.js';
|
import Settings from '../pages/Settings.js';
|
||||||
import User from '../pages/User.js';
|
import User from '../pages/User.js';
|
||||||
import Catalog from '../pages/Catalog.js';
|
import Catalog from '../pages/Catalog.js';
|
||||||
|
import Item from '../pages/Item.js';
|
||||||
|
|
||||||
axios.defaults.withCredentials = true
|
axios.defaults.withCredentials = true
|
||||||
|
|
||||||
|
|
@ -170,6 +171,10 @@ const App = () => {
|
||||||
<Catalog user={user}/>
|
<Catalog user={user}/>
|
||||||
</Route>
|
</Route>
|
||||||
|
|
||||||
|
<GuardedRoute exact path="/item/:id" meta={{auth: true}}>
|
||||||
|
<Item user={user}/>
|
||||||
|
</GuardedRoute>
|
||||||
|
|
||||||
<Route exact path="/catalog/category/:id">
|
<Route exact path="/catalog/category/:id">
|
||||||
<Catalog user={user}/>
|
<Catalog user={user}/>
|
||||||
</Route>
|
</Route>
|
||||||
|
|
|
||||||
|
|
@ -105,12 +105,12 @@ const Catalog = (props) => {
|
||||||
<>
|
<>
|
||||||
<Link to={`/item/${item.id}`} className={`flex graphic-post-column col-3`}>
|
<Link to={`/item/${item.id}`} className={`flex graphic-post-column col-3`}>
|
||||||
<div className={`flex column mb-10 alc`}>
|
<div className={`flex column mb-10 alc`}>
|
||||||
[Thumbnail.]
|
<img src='/images/testing/hat.png' className='img-fluid graphic-thumb' />
|
||||||
</div>
|
</div>
|
||||||
<div className={`flex flex-column m-0`}>
|
<div className={`flex flex-column m-0 jcc alc`}>
|
||||||
<div className={`flex row w-fit-content`}><h6 className={`m-0 mr-15 fs13`}>{item.title}</h6></div>
|
<div className={`flex row w-fit-content`}><h6 className={`m-0 mr-15 fs13`}>{item.title}</h6></div>
|
||||||
<div className={`row fs15 w-fit-content`}>
|
<div className={`row fs15 w-fit-content`}>
|
||||||
<p className={`w-fit-content`}>${item.current_price}</p>
|
<p className={`w-fit-content`}>{item.current_price? `$${item.current_price}` : `N/A`}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ const CreateReply = (props) => {
|
||||||
form.append('creator_id', user.id);
|
form.append('creator_id', user.id);
|
||||||
form.append('token', encodeURIComponent(getCookie(`gtok`)));
|
form.append('token', encodeURIComponent(getCookie(`gtok`)));
|
||||||
setWaitingForSubmission(true);
|
setWaitingForSubmission(true);
|
||||||
await axios.post(`${protocol}apis.${url}/api/create/reply/${post.post.id}`, form, {headers: {'X-CSRF-TOKEN': document.querySelector(`meta[name="csrf-token"]`).content, "X-Requested-With":"XMLHttpRequest"}}).then(data=>{
|
await axios.post(`${protocol}apis.${url}/api/create/reply/${postId}`, form, {headers: {'X-CSRF-TOKEN': document.querySelector(`meta[name="csrf-token"]`).content, "X-Requested-With":"XMLHttpRequest"}}).then(data=>{
|
||||||
const res = data.data;
|
const res = data.data;
|
||||||
console.log(res);
|
console.log(res);
|
||||||
if (res.badInputs.length >= 1) {
|
if (res.badInputs.length >= 1) {
|
||||||
|
|
@ -54,7 +54,7 @@ const CreateReply = (props) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
waitingForSubmission && !post.loading? <Loader/> :
|
waitingForSubmission || post.loading? <Loader/> :
|
||||||
<Card>
|
<Card>
|
||||||
<CardTitle>Reply to '{post.post.title}'</CardTitle>
|
<CardTitle>Reply to '{post.post.title}'</CardTitle>
|
||||||
<div className="p-2 row">
|
<div className="p-2 row">
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@ const Forum = (props) => {
|
||||||
<>
|
<>
|
||||||
<Link to={`/forum/post/${post.id}`} className={`flex graphic-post`}>
|
<Link to={`/forum/post/${post.id}`} className={`flex graphic-post`}>
|
||||||
<div className={`flex column mr-15 alc`}>
|
<div className={`flex column mr-15 alc`}>
|
||||||
[Avatar.]
|
<img src='/images/testing/headshot.png' className='img-fluid graphic-thumb' />
|
||||||
</div>
|
</div>
|
||||||
<div className={`flex row m-0`}>
|
<div className={`flex row m-0`}>
|
||||||
<div className={`flex row`}><h5 className={`m-0 mr-15`}>{post.locked == 1? <i class="fa-solid fa-lock"></i> : null} {post.title}</h5></div>
|
<div className={`flex row`}><h5 className={`m-0 mr-15`}>{post.locked == 1? <i class="fa-solid fa-lock"></i> : null} {post.title}</h5></div>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,198 @@
|
||||||
|
// © XlXi 2021
|
||||||
|
// Graphictoria 5
|
||||||
|
|
||||||
|
import axios from 'axios';
|
||||||
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { Link, useHistory, useParams } from "react-router-dom";
|
||||||
|
|
||||||
|
import Config from '../config.js';
|
||||||
|
|
||||||
|
import SetTitle from "../Helpers/Title.js";
|
||||||
|
|
||||||
|
import Loader from '../Components/Loader.js';
|
||||||
|
|
||||||
|
import { GenericErrorModal } from './Errors.js';
|
||||||
|
import { Card, CardTitle } from '../Components/Card.js';
|
||||||
|
import { paginate } from '../helpers/utils.js';
|
||||||
|
|
||||||
|
import { Modal } from 'react-bootstrap';
|
||||||
|
|
||||||
|
var url = Config.BaseUrl.replace('http://', '');
|
||||||
|
var protocol = Config.Protocol;
|
||||||
|
|
||||||
|
const Item = (props) => {
|
||||||
|
|
||||||
|
var id = useParams().id;
|
||||||
|
const [validity, setValidity] = useState({error: false, message: ``, inputs: []});
|
||||||
|
const [state, setState] = useState({offline: false, loading: true});
|
||||||
|
const [item, setPost] = useState({item: [], sellingPrices: {sellingPrices: [], meta: [], currentPage: 1}});
|
||||||
|
const [show, setShow] = useState(false);
|
||||||
|
const user = props.user;
|
||||||
|
const history = useHistory();
|
||||||
|
|
||||||
|
const fetchItem = async () => {
|
||||||
|
await axios.get(`${protocol}apis.${url}/fetch/item/${id}?page=${item.sellingPrices.currentPage}`, {headers: {"X-Requested-With":"XMLHttpRequest"}}).then(data=>{
|
||||||
|
if (!data.data) {history.push(`/catalog`);}
|
||||||
|
const res = data.data;
|
||||||
|
SetTitle(res.item.title);
|
||||||
|
setPost({item: res.item, sellingPrices: {...item.sellingPrices, sellingPrices: res.sellingPrices.data, meta: res.sellingPrices}});
|
||||||
|
}).catch(error=>{console.log(error);});
|
||||||
|
}
|
||||||
|
|
||||||
|
const buyItem = async (decision, isSelling, sellingId) => {
|
||||||
|
setState({...state, loading: true});
|
||||||
|
const body = new FormData();
|
||||||
|
body.append(`decision`, decision);
|
||||||
|
if (isSelling) body.append('sellingId', sellingId);
|
||||||
|
await axios.post(`${protocol}apis.${url}/api/catalog/buy/${id}?page=${item.sellingPrices.currentPage}`, body, {headers: {"X-Requested-With":"XMLHttpRequest"}}).then(data=>{
|
||||||
|
if (!data.data) {history.push(`/catalog`);}
|
||||||
|
setState({...state, loading: false});
|
||||||
|
const res = data.data;
|
||||||
|
if (res.badInputs.length >= 1) {
|
||||||
|
setValidity({error: true, message:res.message, inputs: res.badInputs});
|
||||||
|
setTimeout(()=>{setValidity({...validity, error: false, inputs: res.badInputs});}, 4000);
|
||||||
|
}else{
|
||||||
|
setPost({item: res.item, sellingPrices: {...item.sellingPrices, sellingPrices: res.sellingPrices.data, meta: res.sellingPrices}});
|
||||||
|
}
|
||||||
|
}).catch(error=>{console.log(error);});
|
||||||
|
}
|
||||||
|
|
||||||
|
const sellItem = async (form) => {
|
||||||
|
setState({...state, loading: true});
|
||||||
|
const body = form;
|
||||||
|
await axios.post(`${protocol}apis.${url}/api/catalog/sell/${id}?page=${item.sellingPrices.currentPage}`, body, {headers: {"X-Requested-With":"XMLHttpRequest"}}).then(data=>{
|
||||||
|
if (!data.data) {history.push(`/catalog`);}
|
||||||
|
setState({...state, loading: false});
|
||||||
|
const res = data.data;
|
||||||
|
if (res.badInputs.length >= 1) {
|
||||||
|
setValidity({error: true, message:res.message, inputs: res.badInputs});
|
||||||
|
setTimeout(()=>{setValidity({...validity, error: false, inputs: res.badInputs});}, 4000);
|
||||||
|
}else{
|
||||||
|
setPost({item: res.item, sellingPrices: {...item.sellingPrices, sellingPrices: res.sellingPrices.data, meta: res.sellingPrices}});
|
||||||
|
}
|
||||||
|
}).catch(error=>{console.log(error);});
|
||||||
|
}
|
||||||
|
|
||||||
|
const paginatePrices = async (decision) => {
|
||||||
|
paginate(decision, item.sellingPrices.currentPage, item.sellingPrices.meta).then(res=>{
|
||||||
|
switch(res){
|
||||||
|
case "increase":
|
||||||
|
setPost({...item, sellingPrices: {...item.sellingPrices, currentPage: item.sellingPrices.currentPage+1}});
|
||||||
|
break;
|
||||||
|
case "decrease":
|
||||||
|
setPost({...item, sellingPrices: {...item.sellingPrices, currentPage: item.sellingPrices.currentPage-1}});
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}).catch(error=>console.log(error));
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(async ()=>{
|
||||||
|
setState({...state, loading: false});
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(async()=>{
|
||||||
|
setState({...state, loading: true});
|
||||||
|
await fetchItem();
|
||||||
|
setState({...state, loading: false});
|
||||||
|
}, [item.sellingPrices.currentPage]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
state.loading
|
||||||
|
?
|
||||||
|
<Loader />
|
||||||
|
:
|
||||||
|
<div className={`flex w-100 column jcc alc`}>
|
||||||
|
<Modal show={show} onHide={(e)=>{setShow(false);}}>
|
||||||
|
<Modal.Header closeButton>
|
||||||
|
<Modal.Title>Sell {item.item.title}</Modal.Title>
|
||||||
|
</Modal.Header>
|
||||||
|
<Modal.Body className={`flex flex-column`}>
|
||||||
|
<form onSubmit={(e)=>{e.preventDefault();sellItem(new FormData(e.target));}}>
|
||||||
|
<h4>How much are you selling for?</h4>
|
||||||
|
<input placeholder={`Ex. $500`} name={`price`} type={`number`} className={`mb-15`}/><br/>
|
||||||
|
<button className={`btn btn-success w-fit-content`} type={`submit`}>Sell Item</button>
|
||||||
|
</form>
|
||||||
|
</Modal.Body>
|
||||||
|
<Modal.Footer>
|
||||||
|
<button className={`btn btn-danger w-fit-content`} onClick={(e)=>{setShow(false);}}>Cancel</button>
|
||||||
|
</Modal.Footer>
|
||||||
|
</Modal>
|
||||||
|
{validity.error?
|
||||||
|
<div className={`px-5 mb-10 w-60 justify-content-center align-items-center`}>
|
||||||
|
<div className={`error-dialog w-100`}>
|
||||||
|
<p className={`mb-0`}>{validity.message}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
: null}
|
||||||
|
<Card>
|
||||||
|
<div className={`flex w-100 column`}>
|
||||||
|
<div className={`flex row fs12`}>
|
||||||
|
<div className={`row w-fit-content`}>
|
||||||
|
<p className={`w-fit-content`}>Date Created:</p>
|
||||||
|
<p className={`w-fit-content padding-none`}>{item.item.created_at}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr/>
|
||||||
|
<div className={`flex row`}>
|
||||||
|
<div className={`col text-left flex flex-column`}>
|
||||||
|
<img src='/images/testing/hat.png' className='img-fluid graphic-thumb-big'/>
|
||||||
|
<p>Price: <strong>{item.item.current_price? `$${item.item.current_price}` : `N/A`}</strong></p>
|
||||||
|
<p>Description: <i>'{item.item.description}'</i></p>
|
||||||
|
{item.item.ownsItem? <strong><p>You own this item!</p></strong> : null}
|
||||||
|
{!item.item.isLimited? <button className={`btn btn-success w-fit-content`} onClick={(e)=>{buyItem(`nonLimited`, false, null);}}>Buy Item</button> : item.item.stock >= 1? <button className={`btn btn-success w-fit-content`} onClick={(e)=>{buyItem(`limited`, false, null);}}>Buy Limited</button> : !item.item.isSelling && item.item.ownsItem? <button className={`btn btn-danger w-fit-content`} onClick={(e)=>{show? setShow(false) : setShow(true)}}>Sell Item</button> : item.item.isSelling? <p>You're selling this item!</p> : <p>Sorry, you don't own this item!</p>}
|
||||||
|
</div>
|
||||||
|
<div className={`flex column col flex-column jcc alc`}>
|
||||||
|
<div className={`flex flex-column`}>
|
||||||
|
<h5 className={`text-left`}>Creator Info:</h5>
|
||||||
|
<img src='/images/testing/avatar.png' className='img-fluid graphic-thumb-big' />
|
||||||
|
<Link to={`/user/${item.item.creator.id}`}>{item.item.creator.username}</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Card>
|
||||||
|
{item.item.isLimited != 0 && item.item.stock <= 0? <div className={`container`}><hr className={`graphictoria-small-card mt-15 mb-15`}/></div> : null}
|
||||||
|
{item.sellingPrices.sellingPrices.length <= 0 && item.item.isLimited != 0 && item.item.stock <= 0? <p className={`w-100 text-center`}>No one is selling this item yet!</p> : null}
|
||||||
|
{item.item.isLimited != 0 && item.item.stock <= 0?
|
||||||
|
<div className={`flex column w-100`}>
|
||||||
|
{item.sellingPrices.sellingPrices.map(reply=>(
|
||||||
|
<div className={`mb-15`}>
|
||||||
|
<Card>
|
||||||
|
<div className={`flex w-100 column`}>
|
||||||
|
<div className={`flex row fs12`}>
|
||||||
|
<div className={`row w-fit-content`}>
|
||||||
|
<p className={`w-fit-content`}>Date posted:</p>
|
||||||
|
<p className={`w-fit-content padding-none`}>{reply.created_at}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr/>
|
||||||
|
<div className={`flex row`}>
|
||||||
|
<div className={`flex column jcc alc col-3`}>
|
||||||
|
<img src='/images/testing/headshot.png' className='img-fluid graphic-thumb' />
|
||||||
|
<Link to={`/user/${reply.seller_id}`}>{reply.seller_name}</Link>
|
||||||
|
</div>
|
||||||
|
<div className={`col text-left float-right flex alc jcc`}>
|
||||||
|
<div className={`flex flex-column flex alc jcc`}>
|
||||||
|
<p>Price: ${reply.price}</p>
|
||||||
|
<p>Item UID: {reply.uid}</p>
|
||||||
|
<button className={`btn btn-success w-fit-content`} onClick={(e)=>{buyItem(`selling`, true, reply.id);}}>Buy</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Card>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
{item.sellingPrices.sellingPrices.length >= 10?
|
||||||
|
<div className={`w-100 jcc alc row mt-15`}>
|
||||||
|
{item.sellingPrices.currentPage >= 2? <button className={`w-fit-content btn btn-primary mr-15`} onClick={(e)=>{paginatePrices(true);}}>Previous Page</button> : null}
|
||||||
|
{item.sellingPrices.currentPage < item.sellingPrices.meta.last_page? <button className={`w-fit-content btn btn-primary`} onClick={(e)=>{paginatePrices(false);}}>Next Page</button> : null}
|
||||||
|
</div> : null}
|
||||||
|
</div> : null}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Item;
|
||||||
|
|
@ -93,7 +93,7 @@ const Post = (props) => {
|
||||||
<hr/>
|
<hr/>
|
||||||
<div className={`flex row`}>
|
<div className={`flex row`}>
|
||||||
<div className={`flex column jcc alc col-3`}>
|
<div className={`flex column jcc alc col-3`}>
|
||||||
<p className={`mb-10`}>[Avatar.]</p>
|
<img src='/images/testing/headshot.png' className='img-fluid graphic-thumb' />
|
||||||
<Link to={`/user/${post.post.creator.id}`}>{post.post.creator.username}</Link>
|
<Link to={`/user/${post.post.creator.id}`}>{post.post.creator.username}</Link>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -119,7 +119,7 @@ const Post = (props) => {
|
||||||
<hr/>
|
<hr/>
|
||||||
<div className={`flex row`}>
|
<div className={`flex row`}>
|
||||||
<div className={`flex column jcc alc col-3`}>
|
<div className={`flex column jcc alc col-3`}>
|
||||||
<p className={`mb-10`}>[Avatar.]</p>
|
<img src='/images/testing/headshot.png' className='img-fluid graphic-thumb' />
|
||||||
<Link to={`/user/${reply.creator_id}`}>{reply.creator_name}</Link>
|
<Link to={`/user/${reply.creator_id}`}>{reply.creator_name}</Link>
|
||||||
</div>
|
</div>
|
||||||
<div className={`col text-left`}>
|
<div className={`col text-left`}>
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ import SetTitle from "../Helpers/Title.js";
|
||||||
import Loader from '../Components/Loader.js';
|
import Loader from '../Components/Loader.js';
|
||||||
|
|
||||||
import { GenericErrorModal } from './Errors.js';
|
import { GenericErrorModal } from './Errors.js';
|
||||||
import { Card, CardTitle } from '../Components/Card.js';
|
import { BigCard, Card, CardTitle } from '../Components/Card.js';
|
||||||
import { getCookie, paginate } from '../helpers/utils.js';
|
import { getCookie, paginate } from '../helpers/utils.js';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
|
|
||||||
|
|
@ -31,7 +31,7 @@ const Settings = (props) => {
|
||||||
switch(setting){
|
switch(setting){
|
||||||
case "aboutMe":
|
case "aboutMe":
|
||||||
setState({...state, loading: true});
|
setState({...state, loading: true});
|
||||||
const body = form;
|
var body = form;
|
||||||
body.append('token', encodeURIComponent(getCookie(`gtok`)));
|
body.append('token', encodeURIComponent(getCookie(`gtok`)));
|
||||||
axios.post(`${protocol}apis.${url}/api/change/user/about`, body, {headers: {'X-CSRF-TOKEN': document.querySelector(`meta[name="csrf-token"]`).content, "X-Requested-With":"XMLHttpRequest"}}).then(data=>{
|
axios.post(`${protocol}apis.${url}/api/change/user/about`, body, {headers: {'X-CSRF-TOKEN': document.querySelector(`meta[name="csrf-token"]`).content, "X-Requested-With":"XMLHttpRequest"}}).then(data=>{
|
||||||
const res = data.data;
|
const res = data.data;
|
||||||
|
|
@ -39,7 +39,37 @@ const Settings = (props) => {
|
||||||
setValidity({error: true, message:res.message, inputs: res.badInputs});
|
setValidity({error: true, message:res.message, inputs: res.badInputs});
|
||||||
setTimeout(()=>{setValidity({...validity, error: false, inputs: res.badInputs});}, 4000);
|
setTimeout(()=>{setValidity({...validity, error: false, inputs: res.badInputs});}, 4000);
|
||||||
}else{
|
}else{
|
||||||
history.push(`/user/${user.id}`);
|
window.location.replace(`/user/${user.id}`); //updates entire user
|
||||||
|
}
|
||||||
|
setState({...state, loading: false});
|
||||||
|
}).catch(error=>{console.log(error);});
|
||||||
|
break;
|
||||||
|
case "changePassword":
|
||||||
|
setState({...state, loading: true});
|
||||||
|
var body = form;
|
||||||
|
body.append('token', encodeURIComponent(getCookie(`gtok`)));
|
||||||
|
axios.post(`${protocol}apis.${url}/api/change/user/password`, body, {headers: {'X-CSRF-TOKEN': document.querySelector(`meta[name="csrf-token"]`).content, "X-Requested-With":"XMLHttpRequest"}}).then(data=>{
|
||||||
|
const res = data.data;
|
||||||
|
if (res.badInputs.length >= 1) {
|
||||||
|
setValidity({error: true, message:res.message, inputs: res.badInputs});
|
||||||
|
setTimeout(()=>{setValidity({...validity, error: false, inputs: res.badInputs});}, 4000);
|
||||||
|
}else{
|
||||||
|
window.location.replace(`/home`); //updates entire user
|
||||||
|
}
|
||||||
|
setState({...state, loading: false});
|
||||||
|
}).catch(error=>{console.log(error);});
|
||||||
|
break;
|
||||||
|
case "changeEmail":
|
||||||
|
setState({...state, loading: true});
|
||||||
|
var body = form;
|
||||||
|
body.append('token', encodeURIComponent(getCookie(`gtok`)));
|
||||||
|
axios.post(`${protocol}apis.${url}/api/change/user/email`, body, {headers: {'X-CSRF-TOKEN': document.querySelector(`meta[name="csrf-token"]`).content, "X-Requested-With":"XMLHttpRequest"}}).then(data=>{
|
||||||
|
const res = data.data;
|
||||||
|
if (res.badInputs.length >= 1) {
|
||||||
|
setValidity({error: true, message:res.message, inputs: res.badInputs});
|
||||||
|
setTimeout(()=>{setValidity({...validity, error: false, inputs: res.badInputs});}, 4000);
|
||||||
|
}else{
|
||||||
|
window.location.replace(`/home`); //updates entire user
|
||||||
}
|
}
|
||||||
setState({...state, loading: false});
|
setState({...state, loading: false});
|
||||||
}).catch(error=>{console.log(error);});
|
}).catch(error=>{console.log(error);});
|
||||||
|
|
@ -88,11 +118,51 @@ const Settings = (props) => {
|
||||||
</div>
|
</div>
|
||||||
<div className="graphictoria-nav-splitter"></div>
|
<div className="graphictoria-nav-splitter"></div>
|
||||||
<div className={`col flex row`}>
|
<div className={`col flex row`}>
|
||||||
<div className={`col flex row jcc alc`}>
|
<div className={`col flex jcc alc`}>
|
||||||
<p>Another Settings.</p>
|
<BigCard className={`w-100`}>
|
||||||
|
<CardTitle>Change your Password</CardTitle>
|
||||||
|
<div>
|
||||||
|
<form method={`OPTIONS`} onSubmit={(e)=>{e.preventDefault();changeSettings(`changePassword`, new FormData(e.target));}} className={`flex column jcc alc`}>
|
||||||
|
<div className={`flex flex-column w-100 mb-15`}>
|
||||||
|
<p>Current Password</p>
|
||||||
|
<input placeholder={`Your Current Password`} className={`w-100 ${(validity.inputs.find(input=>input == `body`)? `is-invalid` : null)}`} name={`currentPassword`}/>
|
||||||
|
</div>
|
||||||
|
<div className={`flex flex-row w-100`}>
|
||||||
|
<div className={`flex flex-column w-100 mr-15`}>
|
||||||
|
<p>New Password</p>
|
||||||
|
<input placeholder={`New Password`} className={`w-100 ${(validity.inputs.find(input=>input == `body`)? `is-invalid` : null)}`} name={`newPassword`}/>
|
||||||
|
</div>
|
||||||
|
<div className={`flex flex-column w-100`}>
|
||||||
|
<p>Re-enter New Password</p>
|
||||||
|
<input placeholder={`Re-enter new Password`} className={`w-100 ${(validity.inputs.find(input=>input == `body`)? `is-invalid` : null)}`} name={`checkNewPassword`}/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button className={`btn btn-success mt-15`}>Submit</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</BigCard>
|
||||||
</div>
|
</div>
|
||||||
<div className={`col flex row jcc alc`}>
|
<div className={`col flex row jcc alc`}>
|
||||||
<p>Another Settings.</p>
|
<div className={`col flex jcc alc`}>
|
||||||
|
<BigCard className={`w-100`}>
|
||||||
|
<CardTitle>Change your Email</CardTitle>
|
||||||
|
<div>
|
||||||
|
<form method={`OPTIONS`} onSubmit={(e)=>{e.preventDefault();changeSettings(`changeEmail`, new FormData(e.target));}} className={`flex column jcc alc`}>
|
||||||
|
<div className={`flex flex-row w-100`}>
|
||||||
|
<div className={`flex flex-column w-100 mr-15`}>
|
||||||
|
<p>New Email</p>
|
||||||
|
<input placeholder={`New Email`} className={`w-100 ${(validity.inputs.find(input=>input == `body`)? `is-invalid` : null)}`} name={`newEmail`}/>
|
||||||
|
</div>
|
||||||
|
<div className={`flex flex-column w-100`}>
|
||||||
|
<p>Current Password</p>
|
||||||
|
<input placeholder={`Current Password`} className={`w-100 ${(validity.inputs.find(input=>input == `body`)? `is-invalid` : null)}`} name={`currentPassword`}/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button className={`btn btn-success mt-15`}>Submit</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</BigCard>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ const User = (props) => {
|
||||||
<div className={`flex flex-column justify-content-center align-items-center`}>
|
<div className={`flex flex-column justify-content-center align-items-center`}>
|
||||||
{
|
{
|
||||||
!metaUser? null :
|
!metaUser? null :
|
||||||
userId == metaUser.id? <p>This is you!</p> :
|
userId == metaUser.id? <Link className={`btn btn-primary w-fit-content`} to={`/auth/settings`}>Settings</Link> :
|
||||||
isFriend && isFriend == `pending`?
|
isFriend && isFriend == `pending`?
|
||||||
<button className={`btn btn-dark disabled w-fit-content`}>Pending...</button>
|
<button className={`btn btn-dark disabled w-fit-content`}>Pending...</button>
|
||||||
: isFriend && isFriend == `needToAccept`?
|
: isFriend && isFriend == `needToAccept`?
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,24 @@ $web-font-path: "https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,w
|
||||||
text-decoration: none !important;
|
text-decoration: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.graphic-thumb-big {
|
||||||
|
height: 250px;
|
||||||
|
width: 250px;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
background-color: #222 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.float-right {
|
||||||
|
margin-left: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.float-left {
|
||||||
|
margin-right: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
// Loader
|
// Loader
|
||||||
|
|
||||||
.gtoria-loader-center {
|
.gtoria-loader-center {
|
||||||
|
|
|
||||||
|
|
@ -58,13 +58,23 @@ Route::get('/fetch/posts/{id}', 'Controller@fetchPosts');
|
||||||
|
|
||||||
Route::get('/fetch/post/{id}', 'Controller@fetchPost');
|
Route::get('/fetch/post/{id}', 'Controller@fetchPost');
|
||||||
|
|
||||||
|
Route::get('/fetch/item/{id}', 'Controller@fetchItem');
|
||||||
|
|
||||||
Route::post('/api/add/user/{id}', 'HomeController@addFriend');
|
Route::post('/api/add/user/{id}', 'HomeController@addFriend');
|
||||||
|
|
||||||
Route::post('/api/create/forum', 'HomeController@createPost');
|
Route::post('/api/create/forum', 'HomeController@createPost');
|
||||||
|
|
||||||
Route::post('/api/create/reply/{id}', 'HomeController@createReply');
|
Route::post('/api/create/reply/{id}', 'HomeController@createReply');
|
||||||
|
|
||||||
Route::post('/api/change/user/about', 'HomeController@settingsAbout');
|
Route::post('/api/catalog/buy/{id}', 'CatalogController@buy');
|
||||||
|
|
||||||
|
Route::post('/api/catalog/sell/{id}', 'CatalogController@sell');
|
||||||
|
|
||||||
|
Route::post('/api/change/user/about', 'SettingsController@settingsAbout');
|
||||||
|
|
||||||
|
Route::post('/api/change/user/password', 'SettingsController@settingsPassword');
|
||||||
|
|
||||||
|
Route::post('/api/change/user/email', 'SettingsController@settingsEmail');
|
||||||
|
|
||||||
Route::fallback(function(){
|
Route::fallback(function(){
|
||||||
return response('{"errors":[{"code":404,"message":"NotFound"}]}', 404)
|
return response('{"errors":[{"code":404,"message":"NotFound"}]}', 404)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue