Skip to content

Commit 81b58bb

Browse files
allanmcarvalhojessarchertaylorotwell
authored
Added pause prompt (#108)
* Added pause prompt * refactoring * Ignore when non-interactive * Update helpers.php --------- Co-authored-by: Jess Archer <jess@jessarcher.com> Co-authored-by: Taylor Otwell <taylor@laravel.com>
1 parent 0ae2de8 commit 81b58bb

File tree

6 files changed

+123
-0
lines changed

6 files changed

+123
-0
lines changed

playground/pause.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
use function Laravel\Prompts\pause;
4+
5+
require __DIR__.'/../vendor/autoload.php';
6+
7+
$continued = pause();
8+
9+
var_dump($continued);

src/Concerns/Themes.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Laravel\Prompts\MultiSelectPrompt;
99
use Laravel\Prompts\Note;
1010
use Laravel\Prompts\PasswordPrompt;
11+
use Laravel\Prompts\PausePrompt;
1112
use Laravel\Prompts\Progress;
1213
use Laravel\Prompts\SearchPrompt;
1314
use Laravel\Prompts\SelectPrompt;
@@ -20,6 +21,7 @@
2021
use Laravel\Prompts\Themes\Default\MultiSelectPromptRenderer;
2122
use Laravel\Prompts\Themes\Default\NoteRenderer;
2223
use Laravel\Prompts\Themes\Default\PasswordPromptRenderer;
24+
use Laravel\Prompts\Themes\Default\PausePromptRenderer;
2325
use Laravel\Prompts\Themes\Default\ProgressRenderer;
2426
use Laravel\Prompts\Themes\Default\SearchPromptRenderer;
2527
use Laravel\Prompts\Themes\Default\SelectPromptRenderer;
@@ -47,6 +49,7 @@ trait Themes
4749
SelectPrompt::class => SelectPromptRenderer::class,
4850
MultiSelectPrompt::class => MultiSelectPromptRenderer::class,
4951
ConfirmPrompt::class => ConfirmPromptRenderer::class,
52+
PausePrompt::class => PausePromptRenderer::class,
5053
SearchPrompt::class => SearchPromptRenderer::class,
5154
MultiSearchPrompt::class => MultiSearchPromptRenderer::class,
5255
SuggestPrompt::class => SuggestPromptRenderer::class,

src/PausePrompt.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Laravel\Prompts;
4+
5+
class PausePrompt extends Prompt
6+
{
7+
/**
8+
* Create a new PausePrompt instance.
9+
*/
10+
public function __construct(public string $message = 'Press enter to continue...') {
11+
$this->required = false;
12+
$this->validate = null;
13+
14+
$this->on('key', fn ($key) => match($key) {
15+
Key::ENTER => $this->submit(),
16+
default => null,
17+
});
18+
}
19+
20+
/**
21+
* Get the value of the prompt.
22+
*/
23+
public function value(): bool
24+
{
25+
return static::$interactive;
26+
}
27+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace Laravel\Prompts\Themes\Default;
4+
5+
use Laravel\Prompts\PausePrompt;
6+
7+
class PausePromptRenderer extends Renderer
8+
{
9+
use Concerns\DrawsBoxes;
10+
11+
/**
12+
* Render the pause prompt.
13+
*/
14+
public function __invoke(PausePrompt $prompt): string
15+
{
16+
match ($prompt->state) {
17+
'submit' => collect(explode(PHP_EOL, $prompt->message))
18+
->each(fn($line) => $this->line($this->gray(" {$line}"))),
19+
default => collect(explode(PHP_EOL, $prompt->message))
20+
->each(fn($line) => $this->line($this->green(" {$line}")))
21+
};
22+
return $this;
23+
}
24+
}

src/helpers.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ function confirm(string $label, bool $default = true, string $yes = 'Yes', strin
5252
return (new ConfirmPrompt(...func_get_args()))->prompt();
5353
}
5454

55+
/**
56+
* Prompt the user to continue or cancel after pausing.
57+
*/
58+
function pause(string $message = 'Press enter to continue...'): bool
59+
{
60+
return (new PausePrompt(...func_get_args()))->prompt();
61+
}
62+
5563
/**
5664
* Prompt the user for text input with auto-completion.
5765
*

tests/Feature/PausePromptTest.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
use Laravel\Prompts\Key;
4+
use Laravel\Prompts\PausePrompt;
5+
use Laravel\Prompts\Prompt;
6+
7+
use function Laravel\Prompts\pause;
8+
9+
it('continues after enter', function () {
10+
Prompt::fake([Key::ENTER]);
11+
12+
$result = pause();
13+
14+
expect($result)->toBeTrue();
15+
16+
Prompt::assertOutputContains('Press enter to continue...');
17+
});
18+
19+
it('allows the message to be changed', function () {
20+
Prompt::fake([Key::ENTER]);
21+
22+
$result = pause('Read and then press enter...');
23+
24+
expect($result)->toBeTrue();
25+
26+
Prompt::assertOutputContains('Read and then press enter...');
27+
});
28+
29+
it('can fall back', function () {
30+
Prompt::fallbackWhen(true);
31+
32+
PausePrompt::fallbackUsing(function (PausePrompt $prompt) {
33+
expect($prompt->message)->toBe('Press enter to continue...');
34+
35+
return true;
36+
});
37+
38+
$result = pause();
39+
40+
expect($result)->toBeTrue();
41+
});
42+
43+
it('does not render when non-interactive', function () {
44+
Prompt::fake();
45+
Prompt::interactive(false);
46+
47+
$result = pause('This should not be rendered');
48+
49+
expect($result)->toBeFalse();
50+
51+
Prompt::assertOutputDoesntContain('This should not be rendered');
52+
});

0 commit comments

Comments
 (0)