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
29 changes: 16 additions & 13 deletions app/External/Slack/Modals/MembershipOptionsModal.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,29 +15,32 @@ class MembershipOptionsModal implements ModalInterface
{
use ModalTrait;

private const MEMBERSHIP_OPTION = 'membership-option';
private const string MEMBERSHIP_OPTION = 'membership-option';

private const SIGN_UP_NEW_MEMBER_VALUE = 'value-sign-up-new-member';
private const string SIGN_UP_NEW_MEMBER_VALUE = 'value-sign-up-new-member';

private const MANAGE_MEMBERS_CARDS_VALUE = 'value-manage-members-cards';
private const string MANAGE_MEMBERS_CARDS_VALUE = 'value-manage-members-cards';

private const MANAGE_OPEN_HOUSE_VALUE = 'value-manage-open-house-doors';
private const string MANAGE_OPEN_HOUSE_VALUE = 'value-manage-open-house-doors';

private const QUICK_OPEN_HOUSE_VALUE = 'value-quick-open-house';
private const string QUICK_OPEN_HOUSE_VALUE = 'value-quick-open-house';

private const ALL_DOORS_DEFAULT_VALUE = 'value-all-doors-default';
private const string ALL_DOORS_DEFAULT_VALUE = 'value-all-doors-default';

private const CREATE_TRAINABLE_EQUIPMENT_VALUE = 'value-create-trainable-equipment';
private const string CREATE_TRAINABLE_EQUIPMENT_VALUE = 'value-create-trainable-equipment';

private const EQUIPMENT_AUTHORIZATION_VALUE = 'value-equipment-authorization';
// Public so the SlackMembershipCommandController can use it to identify if the only option is equipment auth.
public const string EQUIPMENT_AUTHORIZATION_VALUE = 'value-equipment-authorization';

private const MANAGE_VOLUNTEER_GROUPS = 'value-manage-volunteer-groups';
private const string MANAGE_VOLUNTEER_GROUPS = 'value-manage-volunteer-groups';

private const COUNTDOWN_TEST_VALUE = 'value-countdown-test';
private const string COUNTDOWN_TEST_VALUE = 'value-countdown-test';

public function __construct(?Customer $customer)
public function __construct(Customer $customer, ?OptionSet $membershipOptions = null)
{
$membershipOptions = self::getMembershipOptions($customer);
if(is_null($membershipOptions)) {
$membershipOptions = self::getMembershipOptions($customer);
}

$this->modalView = Kit::modal(
title: 'What do you want to do?',
Expand Down Expand Up @@ -115,7 +118,7 @@ public static function handle(SlackRequest $request): JsonResponse
return $modal->update();
}

private static function getMembershipOptions(?Customer $customer): OptionSet
public static function getMembershipOptions(?Customer $customer): OptionSet
{
$optionSet = Kit::optionSet();

Expand Down
30 changes: 24 additions & 6 deletions app/Http/Controllers/SlackMembershipCommandController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,43 @@
namespace App\Http\Controllers;

use App\External\Slack\CommonResponses;
use App\External\Slack\Modals\EquipmentAuthorization;
use App\External\Slack\Modals\MembershipOptionsModal;
use App\Http\Requests\SlackRequest;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Response;
use SlackPhp\BlockKit\Kit;
use Illuminate\Support\Facades\Log;

class SlackMembershipCommandController extends Controller
{
public function __invoke(SlackRequest $request)
public function __invoke(SlackRequest $request): Response|JsonResponse
{
$customer = $request->customer();
if ($customer === null) {
if (is_null($customer)) {
Log::info("Membership command invoked by unknown user {$request->getSlackId()}");
return Kit::message(
return response()->json(Kit::message(
text: CommonResponses::unrecognizedUser(),
);
));
}

$modal = new MembershipOptionsModal($customer);
$modal->open($request->get('trigger_id'));
$trigger_id = $request->get('trigger_id');

$membershipOptions = MembershipOptionsModal::getMembershipOptions($customer);

// If the user can only do an equipment authorization, jump directly to that modal screen to reduce friction.
if($membershipOptions->count()) {
$option = $membershipOptions->offsetGet(0);
if($option->value == MembershipOptionsModal::EQUIPMENT_AUTHORIZATION_VALUE) {
$modal = new EquipmentAuthorization($customer);
$modal->open($trigger_id);

return response('');
}
}

$modal = new MembershipOptionsModal($customer, $membershipOptions);
$modal->open($trigger_id);

return response('');
}
Expand Down