Skip to content

Commit dcaee6c

Browse files
Merge branch 'main' into add-mobile-search-input
2 parents d02e5eb + b5b9319 commit dcaee6c

File tree

19 files changed

+512
-228
lines changed

19 files changed

+512
-228
lines changed

app/Enums/Subscription.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@ public static function fromStripePriceId(string $priceId): self
2929
config('subscriptions.plans.mini.stripe_price_id'),
3030
config('subscriptions.plans.mini.stripe_price_id_eap') => self::Mini,
3131
config('subscriptions.plans.pro.stripe_price_id'),
32+
config('subscriptions.plans.pro.stripe_price_id_discounted'),
3233
config('subscriptions.plans.pro.stripe_price_id_eap') => self::Pro,
3334
config('subscriptions.plans.max.stripe_price_id'),
35+
config('subscriptions.plans.max.stripe_price_id_discounted'),
3436
config('subscriptions.plans.max.stripe_price_id_eap') => self::Max,
3537
default => throw new RuntimeException("Unknown Stripe price id: {$priceId}"),
3638
};
@@ -53,12 +55,18 @@ public function name(): string
5355
return config("subscriptions.plans.{$this->value}.name");
5456
}
5557

56-
public function stripePriceId(bool $forceEap = false): string
58+
public function stripePriceId(bool $forceEap = false, bool $discounted = false): string
5759
{
5860
// EAP ends June 1st at midnight UTC
59-
return now()->isBefore('2025-06-01 00:00:00') || $forceEap
60-
? config("subscriptions.plans.{$this->value}.stripe_price_id_eap")
61-
: config("subscriptions.plans.{$this->value}.stripe_price_id");
61+
if (now()->isBefore('2025-06-01 00:00:00') || $forceEap) {
62+
return config("subscriptions.plans.{$this->value}.stripe_price_id_eap");
63+
}
64+
65+
if ($discounted) {
66+
return config("subscriptions.plans.{$this->value}.stripe_price_id_discounted");
67+
}
68+
69+
return config("subscriptions.plans.{$this->value}.stripe_price_id");
6270
}
6371

6472
public function stripePaymentLink(): string

app/Filament/Resources/WallOfLoveSubmissionResource.php

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,25 +49,6 @@ public static function form(Form $form): Form
4949
->maxLength(1000)
5050
->rows(4),
5151
]),
52-
53-
Forms\Components\Section::make('Review Information')
54-
->schema([
55-
Forms\Components\Select::make('user_id')
56-
->relationship('user', 'name')
57-
->required()
58-
->disabled(),
59-
60-
Forms\Components\DateTimePicker::make('approved_at')
61-
->label('Approved At'),
62-
63-
Forms\Components\Select::make('approved_by')
64-
->relationship('approvedBy', 'name')
65-
->label('Approved By'),
66-
67-
Forms\Components\Placeholder::make('created_at')
68-
->label('Submitted At')
69-
->content(fn (WallOfLoveSubmission $record): ?string => $record->created_at?->diffForHumans()),
70-
]),
7152
]);
7253
}
7354

app/Filament/Resources/WallOfLoveSubmissionResource/Pages/EditWallOfLoveSubmission.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace App\Filament\Resources\WallOfLoveSubmissionResource\Pages;
44

5+
use App\Filament\Resources\UserResource;
56
use App\Filament\Resources\WallOfLoveSubmissionResource;
67
use Filament\Actions;
78
use Filament\Resources\Pages\EditRecord;
@@ -14,6 +15,11 @@ protected function getHeaderActions(): array
1415
{
1516
return [
1617
Actions\DeleteAction::make(),
18+
Actions\Action::make('user')
19+
->icon('heroicon-s-user')
20+
->action(function ($record) {
21+
return redirect(UserResource::getUrl('edit', ['record' => $record]));
22+
}),
1723
];
1824
}
1925
}

app/Http/Controllers/Api/LicenseController.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,19 @@
1616

1717
class LicenseController extends Controller
1818
{
19+
public function index(Request $request)
20+
{
21+
$email = $request->query('email');
22+
23+
$user = User::where('email', $email)->firstOrFail();
24+
25+
if ($request->has('source')) {
26+
$licenses = $user->licenses()->where('source', $request->query('source'))->get();
27+
}
28+
29+
return LicenseResource::collection($licenses ?? $user->licenses);
30+
}
31+
1932
public function store(Request $request)
2033
{
2134
$validated = $request->validate([
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Api;
4+
5+
use App\Enums\LicenseSource;
6+
use App\Enums\Subscription;
7+
use App\Http\Controllers\Controller;
8+
use App\Http\Resources\Api\LicenseResource;
9+
use App\Jobs\CreateAnystackLicenseJob;
10+
use App\Models\License;
11+
use App\Models\User;
12+
use Illuminate\Http\Request;
13+
use Illuminate\Support\Facades\Hash;
14+
use Illuminate\Support\Facades\URL;
15+
use Illuminate\Support\Str;
16+
use Illuminate\Validation\Rules\Enum;
17+
18+
class TemporaryLinkController extends Controller
19+
{
20+
public function store(Request $request)
21+
{
22+
$validated = $request->validate([
23+
'email' => 'required|email',
24+
'route' => 'required|string',
25+
]);
26+
27+
$url = URL::temporarySignedRoute(
28+
$validated['route'],
29+
now()->addMinutes($request->integer('expiration', 30)),
30+
[
31+
'email' => $validated['email']
32+
]
33+
);
34+
35+
return response()->json(['url' => $url]);
36+
}
37+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\Http\Resources;
4+
5+
use Illuminate\Http\Request;
6+
use Illuminate\Http\Resources\Json\ResourceCollection;
7+
8+
class LicenseCollection extends ResourceCollection
9+
{
10+
/**
11+
* Transform the resource collection into an array.
12+
*
13+
* @return array<int|string, mixed>
14+
*/
15+
public function toArray(Request $request): array
16+
{
17+
return parent::toArray($request);
18+
}
19+
}

app/Livewire/MobilePricing.php

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,35 @@
99
use Illuminate\Support\Facades\Log;
1010
use Illuminate\Support\Facades\Validator;
1111
use Illuminate\Support\Str;
12+
use Livewire\Attributes\Locked;
1213
use Livewire\Component;
1314

1415
class MobilePricing extends Component
1516
{
17+
#[Locked]
18+
public bool $discounted = false;
19+
20+
#[Locked]
21+
public $user;
22+
1623
protected $listeners = [
1724
'purchase-request-submitted' => 'handlePurchaseRequest',
1825
];
1926

27+
public function mount()
28+
{
29+
if (request()->has('email')) {
30+
$this->user = $this->findOrCreateUser(request()->query('email'));
31+
}
32+
}
33+
2034
public function handlePurchaseRequest(array $data)
2135
{
22-
$user = $this->findOrCreateUser($data['email']);
36+
if (!$this->user) {
37+
$user = $this->findOrCreateUser($data['email']);
38+
}
2339

24-
return $this->createCheckoutSession($data['plan'], $user);
40+
return $this->createCheckoutSession($data['plan'], $this->user ?? $user);
2541
}
2642

2743
public function createCheckoutSession(?string $plan, ?User $user = null)
@@ -57,7 +73,7 @@ public function createCheckoutSession(?string $plan, ?User $user = null)
5773
$user->createOrGetStripeCustomer();
5874

5975
$checkout = $user
60-
->newSubscription('default', $subscription->stripePriceId())
76+
->newSubscription('default', $subscription->stripePriceId(discounted: $this->discounted))
6177
->allowPromotionCodes()
6278
->checkout([
6379
'success_url' => $this->successUrl(),

app/Livewire/PurchaseModal.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ public function submit(): void
4040
'email' => $this->email,
4141
'plan' => $this->selectedPlan,
4242
]);
43-
44-
$this->closeModal();
4543
}
4644

4745
public function render()

config/subscriptions.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
'name' => 'Pro',
1515
'stripe_price_id' => env('STRIPE_PRO_PRICE_ID'),
1616
'stripe_price_id_eap' => env('STRIPE_PRO_PRICE_ID_EAP'),
17+
'stripe_price_id_discounted' => env('STRIPE_PRO_PRICE_ID_DISCOUNTED'),
1718
'stripe_payment_link' => env('STRIPE_PRO_PAYMENT_LINK'),
1819
'anystack_product_id' => env('ANYSTACK_PRODUCT_ID'),
1920
'anystack_policy_id' => env('ANYSTACK_PRO_POLICY_ID'),
@@ -22,6 +23,7 @@
2223
'name' => 'Max',
2324
'stripe_price_id' => env('STRIPE_MAX_PRICE_ID'),
2425
'stripe_price_id_eap' => env('STRIPE_MAX_PRICE_ID_EAP'),
26+
'stripe_price_id_discounted' => env('STRIPE_MAX_PRICE_ID_DISCOUNTED'),
2527
'stripe_payment_link' => env('STRIPE_MAX_PAYMENT_LINK'),
2628
'anystack_product_id' => env('ANYSTACK_PRODUCT_ID'),
2729
'anystack_policy_id' => env('ANYSTACK_MAX_POLICY_ID'),

0 commit comments

Comments
 (0)