Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions app/Enums/FeatureFlag.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,6 @@ enum FeatureFlag: string implements HasLabel
#[DefaultFeatureFlagState(true)]
case UserNavigation = 'user_navigation';

#[DefaultFeatureFlagState(true)]
case BroadcasterOnboarding = 'broadcaster_onboarding';

#[Description('Toggles the Tenant Feature in the Broadcaster Dashboard')]
#[DefaultFeatureFlagState(false)]
case BroadcasterTenant = 'broadcaster_tenant';
Expand Down
2 changes: 2 additions & 0 deletions app/Filament/Dashboard/Pages/Broadcaster/GeneralSettings.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use App\Enums\Clips\ClipStatus;
use App\Enums\Filament\LucideIcon;
use App\Filament\Dashboard\Actions\ApplyDefaultStatusAction;
use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding;
use App\Models\Broadcaster\Broadcaster;
use BackedEnum;
use Filament\Facades\Filament;
Expand All @@ -35,6 +36,7 @@
*/
class GeneralSettings extends Page implements HasForms
{
use DisabledNavigationUntilOnboarding;
use InteractsWithForms;

/** @var array<string, mixed>|null */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use App\Enums\Broadcaster\DashboardNavigationGroup;
use App\Enums\Broadcaster\DashboardNavigationItem;
use App\Enums\Filament\LucideIcon;
use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding;
use App\Filament\Resources\Categories\CategorySelect;
use App\Models\Broadcaster\Broadcaster;
use App\Models\Broadcaster\BroadcasterSubmissionFilter;
Expand Down Expand Up @@ -36,6 +37,7 @@

class ManageCategoryFilter extends Page implements HasTable
{
use DisabledNavigationUntilOnboarding;
use InteractsWithActions;
use InteractsWithSchemas;
use InteractsWithTable;
Expand Down
2 changes: 2 additions & 0 deletions app/Filament/Dashboard/Pages/Broadcaster/ManageTeamMember.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use App\Enums\Broadcaster\DashboardNavigationItem;
use App\Enums\FeatureFlag;
use App\Enums\Filament\LucideIcon;
use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding;
use App\Filament\Resources\Users\UserSelect;
use App\Models\Broadcaster\Broadcaster;
use App\Support\FeatureFlag\Feature;
Expand Down Expand Up @@ -41,6 +42,7 @@

class ManageTeamMember extends Page implements HasForms, HasTable
{
use DisabledNavigationUntilOnboarding;
use InteractsWithActions;
use InteractsWithForms;
use InteractsWithTable;
Expand Down
2 changes: 2 additions & 0 deletions app/Filament/Dashboard/Pages/Broadcaster/ManageUserFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use App\Enums\Broadcaster\DashboardNavigationItem;
use App\Enums\FeatureFlag;
use App\Enums\Filament\LucideIcon;
use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding;
use App\Filament\Resources\Users\UserSelect;
use App\Models\Broadcaster\Broadcaster;
use App\Models\User;
Expand Down Expand Up @@ -38,6 +39,7 @@

class ManageUserFilter extends Page implements HasTable
{
use DisabledNavigationUntilOnboarding;
use InteractsWithActions;
use InteractsWithSchemas;
use InteractsWithTable;
Expand Down
3 changes: 3 additions & 0 deletions app/Filament/Dashboard/Pages/Dashboard.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use App\Enums\Broadcaster\BroadcasterPermission;
use App\Enums\Filament\LucideIcon;
use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding;
use BackedEnum;
use Filament\Facades\Filament;
use Filament\Pages\Dashboard as BaseDashboard;
Expand All @@ -14,6 +15,8 @@

class Dashboard extends BaseDashboard
{
use DisabledNavigationUntilOnboarding;

protected static string|BackedEnum|null $navigationIcon = LucideIcon::House;

public static function canAccess(): bool
Expand Down
195 changes: 195 additions & 0 deletions app/Filament/Dashboard/Pages/Onboarding.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
<?php

declare(strict_types=1);

namespace App\Filament\Dashboard\Pages;

use App\Enums\Broadcaster\BroadcasterConsent;
use App\Enums\Clips\ClipStatus;
use App\Enums\Filament\LucideIcon;
use App\Models\Broadcaster\Broadcaster;
use App\Models\Broadcaster\BroadcasterConsentLog;
use BackedEnum;
use Filament\Actions\Action;
use Filament\Facades\Filament;
use Filament\Forms\Components\CheckboxList;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Pages\Page;
use Filament\Schemas\Components\Actions;
use Filament\Schemas\Components\EmbeddedSchema;
use Filament\Schemas\Components\Form;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Utilities\Set;
use Filament\Schemas\Schema;
use Filament\Support\Enums\Alignment;
use Illuminate\Contracts\Support\Htmlable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

class Onboarding extends Page implements HasForms
{
use InteractsWithForms;

public ?array $formData = [];

protected string $view = 'filament.dashboard.pages.onboarding-page';

protected static bool $shouldRegisterNavigation = false;

protected static string|BackedEnum|null $navigationIcon = LucideIcon::UserPlus;

public static function canAccess(): bool
{
return Filament::getTenant()?->getKey() === auth()->id();
}

public function getHeading(): string|Htmlable|null
{
return __('dashboard/onboarding.heading', ['username' => auth()->user()->name]);
}

public function getSubheading(): string|Htmlable|null
{
return __('dashboard/onboarding.setup.heading');
}

public function mount(): void
{
$broadcaster = $this->getBroadcaster();

if ($broadcaster->exists && $broadcaster->onboarded_at !== null) {
$this->redirect(Dashboard::getUrl(panel: 'dashboard', tenant: $broadcaster));
}

$this->getSchema('form')->fill([
'submit_user_allowed' => true,
'submit_mods_allowed' => true,
'default_clip_status' => ClipStatus::NeedApproval,
'consent' => [],
]);
}

public function content(Schema $schema): Schema
{
return $schema->components([
Form::make([EmbeddedSchema::make('form')])
->footer([
Actions::make([
Action::make('save')
->label(__('dashboard/onboarding.setup.submit'))
->keyBindings(['mod+s'])
->submit('save'),
])
->alignment(Alignment::End)
->sticky()
->key('form-actions'),
])
->livewireSubmitHandler('save')
->id('form'),
]);
}

public function form(Schema $schema): Schema
{
return $schema
->statePath('formData')
->schema([
Section::make(__('dashboard/onboarding.setup.consent.heading'))
->description(__('dashboard/onboarding.setup.consent.subheading'))
->schema([
CheckboxList::make('consent')
->options(BroadcasterConsent::class)
->hiddenLabel(),
]),

Section::make(__('dashboard/onboarding.setup.default_clip_status.heading'))
->description(__('dashboard/onboarding.setup.default_clip_status.subheading'))
->schema([
Radio::make('default_clip_status')
->options(
collect(ClipStatus::defaultableOptions())
->mapWithKeys(fn (ClipStatus $status): array => [$status->value => $status->getLabel()])
->toArray()
)
->descriptions(
collect(ClipStatus::defaultableOptions())
->mapWithKeys(fn (ClipStatus $status): array => [
$status->value => __('dashboard/onboarding.setup.default_clip_status.options.'.Str::snake($status->name)),
])
->toArray()
)
->default(ClipStatus::NeedApproval)
->hiddenLabel()
->required(),
]),

Section::make(__('dashboard/onboarding.setup.submissions.heading'))
->description(__('dashboard/onboarding.setup.submissions.subheading'))
->schema([
Toggle::make('submit_user_allowed')
->afterStateUpdated(function (bool $state, Set $set): void {
if ($state) {
$set('submit_mods_allowed', true);
}
})
->extraAlpineAttributes(['x-on:change' => 'console.log(1)'])
->helperText(__('dashboard/onboarding.setup.submissions.options.everyone.description'))
->label(__('dashboard/onboarding.setup.submissions.options.everyone.label'))
->default(true)
->live(),

Toggle::make('submit_mods_allowed')
->afterStateUpdated(function (bool $state, Set $set): void {
if (! $state) {
$set('submit_user_allowed', false);
}
})
->helperText(__('dashboard/onboarding.setup.submissions.options.mods.description'))
->label(__('dashboard/onboarding.setup.submissions.options.mods.label'))
->default(true)
->live(),
]),
]);
}

public function save(): void
{
$state = $this->getSchema('form')->getState();
$broadcaster = $this->getBroadcaster();

DB::transaction(function () use ($broadcaster, $state): void {
Broadcaster::withTrashed()->updateOrCreate(['id' => $broadcaster->id], [
'consent' => $state['consent'],
'submit_user_allowed' => $state['submit_user_allowed'],
'submit_mods_allowed' => $state['submit_mods_allowed'],
'default_clip_status' => $state['default_clip_status'],
'onboarded_at' => now(),
'deleted_at' => null,
]);

BroadcasterConsentLog::create([
'broadcaster_id' => $broadcaster->id,
'state' => collect($state['consent'])->values()->all(),
'changed_by' => auth()->id(),
'change_reason' => 'Self Onboarding',
'changed_at' => now(),
]);
});

$this->redirect(Dashboard::getUrl(panel: 'dashboard', tenant: $broadcaster));
}

/**
* just a wrapper around getTenant so we have autocompletion stuff for Broadcaster
*
* @return Broadcaster
*/
private function getBroadcaster(): Model
{
return Filament::getTenant();
}
}
3 changes: 3 additions & 0 deletions app/Filament/Dashboard/Resources/Clips/ClipResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use App\Filament\Dashboard\Resources\Clips\Schemas\ClipForm;
use App\Filament\Dashboard\Resources\Clips\Schemas\ClipInfolist;
use App\Filament\Dashboard\Resources\Clips\Tables\ClipsTable;
use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding;
use App\Models\Clip;
use BackedEnum;
use Filament\Facades\Filament;
Expand All @@ -24,6 +25,8 @@

class ClipResource extends Resource
{
use DisabledNavigationUntilOnboarding;

protected static bool $shouldSkipAuthorization = true;

protected static ?string $model = Clip::class;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use App\Filament\Dashboard\Resources\RemovalRequests\Schemas\RemovalRequestForm;
use App\Filament\Dashboard\Resources\RemovalRequests\Schemas\RemovalRequestInfolist;
use App\Filament\Dashboard\Resources\RemovalRequests\Tables\RemovalRequestsTable;
use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding;
use App\Models\Broadcaster\RemovalRequest;
use App\Support\FeatureFlag\Feature;
use BackedEnum;
Expand All @@ -23,6 +24,8 @@

class RemovalRequestResource extends Resource
{
use DisabledNavigationUntilOnboarding;

protected static bool $shouldSkipAuthorization = true;

protected static ?string $model = RemovalRequest::class;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

declare(strict_types=1);

namespace App\Filament\Dashboard\Traits;

use App\Enums\Filament\LucideIcon;
use App\Models\Broadcaster\Broadcaster;
use Filament\Facades\Filament;
use Filament\Navigation\NavigationItem;

/**
* Disables the navigation item for this page if the user is on their own channel and has not onboarded yet
*/
trait DisabledNavigationUntilOnboarding
{
public static function getNavigationItems(): array
{
/** @var Broadcaster $tenant */
$tenant = Filament::getTenant();
$user = auth()->user();
$items = parent::getNavigationItems();

if ($user->id !== $tenant->id || $tenant->onboarded_at !== null) {
return $items;
}

return collect($items)
->map(fn (NavigationItem $item): NavigationItem => $item
->extraAttributes([
'class' => 'opacity-40 cursor-not-allowed select-none [&_a]:pointer-events-none',
'aria-label' => __('dashboard/navigation.locked'),
'title' => __('dashboard/navigation.locked'),
'aria-disabled' => 'true',
])
->icon(LucideIcon::Lock),
)
->all();
}
}
26 changes: 0 additions & 26 deletions app/Http/Controllers/Broadcaster/OnboardingController.php

This file was deleted.

Loading