From 42d00f60b995e117d8517c0c2c2d85429ddc7fdb Mon Sep 17 00:00:00 2001 From: Immanuel Onyeka Date: Tue, 22 Jun 2021 14:40:16 -0400 Subject: [PATCH] Create support section --- app/Http/Controllers/BillingController.php | 2 +- app/Http/Controllers/Ticket.php | 35 +++++++++ app/Http/Controllers/UserController.php | 10 +-- app/Mail/SupportTicket.php | 47 +++++++++++ app/Models/Ticket.php | 16 ++++ app/Models/User.php | 5 ++ .../2021_05_19_185302_create_orders_table.php | 3 +- ...2021_06_22_153337_create_tickets_table.php | 38 +++++++++ resources/images/chat-text-fill.svg | 3 + resources/images/life-preserver.svg | 3 + resources/js/panel/orders.vue | 21 +++-- resources/js/panel/panel.vue | 20 +++-- resources/js/panel/settings.vue | 2 +- resources/js/panel/sidebar.vue | 9 +++ resources/js/panel/support.vue | 77 +++++++++++++++++++ resources/scss/main.scss | 60 ++++++++++++++- resources/views/home.blade.php | 9 +-- resources/views/support-ticket.blade.php | 24 ++++++ routes/web.php | 2 + 19 files changed, 355 insertions(+), 31 deletions(-) create mode 100644 app/Http/Controllers/Ticket.php create mode 100644 app/Mail/SupportTicket.php create mode 100644 app/Models/Ticket.php create mode 100644 database/migrations/2021_06_22_153337_create_tickets_table.php create mode 100644 resources/images/chat-text-fill.svg create mode 100644 resources/images/life-preserver.svg create mode 100644 resources/js/panel/support.vue create mode 100644 resources/views/support-ticket.blade.php diff --git a/app/Http/Controllers/BillingController.php b/app/Http/Controllers/BillingController.php index 24f83c7..9262c91 100644 --- a/app/Http/Controllers/BillingController.php +++ b/app/Http/Controllers/BillingController.php @@ -201,7 +201,7 @@ class BillingController extends Controller $transaction = Transaction::find($transaction_id); if ($transaction->completed) { - return; + abort(422, 'Bad transaction ID'); } $user = $transaction->user; diff --git a/app/Http/Controllers/Ticket.php b/app/Http/Controllers/Ticket.php new file mode 100644 index 0000000..abfbc2b --- /dev/null +++ b/app/Http/Controllers/Ticket.php @@ -0,0 +1,35 @@ +validate([ + 'topic' => 'required', + 'message' = 'required' + ]); + + $ticket = $this->create($request->topic); + + Mail::to('donotreply@trendplays.com')->send(new + SupportTicket($ticket, $request->message)); + } + + //Should probably have a minimum character restriction later + public function create(String $type){ + $ticket = new Ticket; + $ticket->user_id = Auth::user()->id; + $ticket->type = $type; + $ticket->status = 'processing'; + $ticket->complete = false; + $ticket->save(); + + return $ticket; + } +} diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 0cb00f3..9e78361 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -7,12 +7,14 @@ use App\Models\User; use App\Models\Order; use App\Models\Service; use App\Notifications\ChangeEmail; + use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\URL; use Illuminate\Auth\Events\Registered; use Illuminate\Support\Facades\Password; use Illuminate\Support\Facades\Auth; + use Stripe\Stripe; use Stripe\Customer; @@ -22,20 +24,16 @@ class UserController extends Controller $validated = $request->validate([ 'name' => 'required|max:30', 'email' => 'required|email|unique:users|max:255', - 'password' => 'required|confirmed|min:8|regex:/[a-z]/|regex:/[A-Z]/|regex:/[0-9]/' + 'password' => 'required|confirmed + |min:8|regex:/[a-z]/|regex:/[A-Z]/|regex:/[0-9]/' ]); - Stripe::setApiKey(config('services.stripe.secret')); - $user = new User; $user->name = $request->name; $user->email = $request->email; $user->role = "client"; $user->active = true; $user->password = Hash::make($request->password); - $user->customer_id = Customer::create(['email' => - $request->email, 'name' => $request->name, 'metadata' => ['user_id' - => $user->id]])->id; $user->save(); event(new Registered($user)); diff --git a/app/Mail/SupportTicket.php b/app/Mail/SupportTicket.php new file mode 100644 index 0000000..f23d60d --- /dev/null +++ b/app/Mail/SupportTicket.php @@ -0,0 +1,47 @@ +name = $ticket->user->name; + $this->email = $ticket->user->email; + $this->message = $message; + $this->type = $ticket->type; + $this->id = $ticket->id; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->view('support-ticket') + ->from('donotreply@trendplays.com') + ->subject("Ticket: $this->id, $this->type"); + } +} diff --git a/app/Models/Ticket.php b/app/Models/Ticket.php new file mode 100644 index 0000000..964dcad --- /dev/null +++ b/app/Models/Ticket.php @@ -0,0 +1,16 @@ +belongsTo(User::class); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index f9fbcc6..94f19d3 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -8,6 +8,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use App\Models\Order; use App\Models\Transaction; +use App\Models\Ticket; use Laravel\Cashier\Billable; class User extends Authenticatable implements MustVerifyEmail @@ -52,4 +53,8 @@ class User extends Authenticatable implements MustVerifyEmail return $this->hasMany(Transaction::class); } + public function tickets() { + return $this->hasMany(Ticket::class); + } + } diff --git a/database/migrations/2021_05_19_185302_create_orders_table.php b/database/migrations/2021_05_19_185302_create_orders_table.php index c4e7335..2953ddf 100644 --- a/database/migrations/2021_05_19_185302_create_orders_table.php +++ b/database/migrations/2021_05_19_185302_create_orders_table.php @@ -23,7 +23,8 @@ class CreateOrdersTable extends Migration $table->string('note')->default(''); $table->string('message')->nullable(); $table->bigInteger('remaining')->default(0); - $table->enum('status', ['processing', 'pending', 'canceled', 'refunded', 'completed', 'error']); + $table->enum('status', ['processing', 'pending', 'canceled', + 'refunded', 'completed', 'error']); $table->string('url'); }); } diff --git a/database/migrations/2021_06_22_153337_create_tickets_table.php b/database/migrations/2021_06_22_153337_create_tickets_table.php new file mode 100644 index 0000000..b043028 --- /dev/null +++ b/database/migrations/2021_06_22_153337_create_tickets_table.php @@ -0,0 +1,38 @@ +id(); + $table->foreignId('user_id')->constrained(); + $table->enum('type', ['order', 'service', 'credits', + 'payment', 'other']); + $table->enum('status', ['processing', 'pending', 'abandoned', + 'refunded', 'completed', 'error'])->nullable(); + $table->boolean('complete'); + $table->string('note')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('tickets'); + } +} diff --git a/resources/images/chat-text-fill.svg b/resources/images/chat-text-fill.svg new file mode 100644 index 0000000..306dbb5 --- /dev/null +++ b/resources/images/chat-text-fill.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/resources/images/life-preserver.svg b/resources/images/life-preserver.svg new file mode 100644 index 0000000..6e1015e --- /dev/null +++ b/resources/images/life-preserver.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/resources/js/panel/orders.vue b/resources/js/panel/orders.vue index 03e292e..e06c75c 100644 --- a/resources/js/panel/orders.vue +++ b/resources/js/panel/orders.vue @@ -1,7 +1,8 @@ diff --git a/resources/js/panel/panel.vue b/resources/js/panel/panel.vue index ad6af1f..53e038b 100644 --- a/resources/js/panel/panel.vue +++ b/resources/js/panel/panel.vue @@ -6,7 +6,9 @@

Welcome, {{user.name}}!

wallet

Credits: {{(user.credits/100).toLocaleString('en')}}

News and Announcements

-

We've just launched. Thanks for joining us.

+

We've just launched. Thanks for joining us! Some features are still + being tested. If you experience a delay in credits being added to your + account, please wait 24 hours before contacting support@trendplays.com.

Recent Activity

@@ -26,11 +28,14 @@
- - - + + + - + +

Are you sure you want to logout?

@@ -47,6 +52,8 @@ v-else-if="active === '#settings'"> '#transaction-complete' || active == '#transaction-failed'"> + + @@ -57,6 +64,7 @@ import Settings from './settings.vue' import PastOrders from './orders.vue' import NewOrder from './services.vue' import TransactionEnd from './transaction-endpoint.vue' +import Support from './support.vue' function getServices() { return fetch("/panel/services", { @@ -98,7 +106,7 @@ function getOrders() { export default { components: { Sidebar, Settings, PastOrders, NewOrder, - TransactionEnd + TransactionEnd, Support }, data() { return {active: window.location.hash, user: null, diff --git a/resources/js/panel/settings.vue b/resources/js/panel/settings.vue index d0bfbc0..21df833 100644 --- a/resources/js/panel/settings.vue +++ b/resources/js/panel/settings.vue @@ -1,6 +1,6 @@ + + + diff --git a/resources/scss/main.scss b/resources/scss/main.scss index 886e0b6..239ff41 100644 --- a/resources/scss/main.scss +++ b/resources/scss/main.scss @@ -56,6 +56,12 @@ input, select { margin: 10px; } +.note-grey { + color: grey; + font-size: 0.8em; + max-width: 70%; +} + .services-cards li { padding-bottom: 8px; &:before { @@ -757,10 +763,6 @@ main.panel { color: vars.getColor("dark-grey"); } - p { - margin: 0; - } - .welcome-pane { text-align: center; } @@ -1372,3 +1374,53 @@ main.terms { display: inline-block; } } + +.support-section .loading-icon { + margin-top: 25%; + color: vars.getColor('brand-orange'); +} + +#support-form { + margin-top: 10%; + + label { + margin: auto; + text-align: center; + width: 10em; + display: block; + margin-bottom: 1em; + } + + select { + display: block; + margin: auto; + margin-bottom: 2em; + width: 10em; + text-align: center; + background: white; + } + + textarea { + display: block; + width: 90%; + margin: auto; + } + + button { + display: block; + font-size: 1em; + margin: auto; + margin-top: 2em; + height: 2.3em; + width: 5em; + @include vars.inverting-button(black, white); + } +} + +.error-message { + text-align: center; + color: vars.getColor('red-alert'); + margin-top: 1em; + margin-bottom: 1em; +} + diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 4dc7784..54623a1 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -56,9 +56,8 @@

Youtube

  • Views often increase within 24 hours
  • -
  • Real people
  • -
  • Targeted by language
  • -
  • Targeted by country
  • +
  • Boost to rankings
  • +
  • High quality users
@@ -90,7 +89,7 @@ twitter-icon

TikTok