Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
88.00% covered (warning)
88.00%
22 / 25
33.33% covered (danger)
33.33%
1 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
ImportSuccessSnippet
88.00% covered (warning)
88.00%
22 / 25
33.33% covered (danger)
33.33%
1 / 3
8.11
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getRedirectWithNotice
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getHtml
95.45% covered (success)
95.45%
21 / 22
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace FileImporter\Html;
4
5use FileImporter\Services\SuccessCache;
6use MediaWiki\Html\Html;
7use MediaWiki\MediaWikiServices;
8use MediaWiki\Title\Title;
9use MediaWiki\User\UserIdentity;
10use MessageLocalizer;
11use OOUI\HtmlSnippet;
12use OOUI\MessageWidget;
13use StatusValue;
14use Wikimedia\Message\MessageSpecifier;
15
16/**
17 * Informational block embedded at the top of page after a successful import.
18 *
19 * @license GPL-2.0-or-later
20 * @author Addshore
21 */
22class ImportSuccessSnippet {
23
24    public const NOTICE_URL_KEY = 'fileImporterSuccess';
25
26    private SuccessCache $cache;
27
28    public function __construct() {
29        $this->cache = MediaWikiServices::getInstance()->getService( 'FileImporterSuccessCache' );
30    }
31
32    /**
33     * Prepares an URL for redirect and stashes additional information for retrieval from that page.
34     *
35     * @return string Target file URL for redirect, including special parameter to show our notice.
36     */
37    public function getRedirectWithNotice( Title $targetTitle, UserIdentity $user, StatusValue $importResult ) {
38        $this->cache->stashImportResult( $targetTitle, $user, $importResult );
39        return $targetTitle->getInternalURL( [ self::NOTICE_URL_KEY => 1 ] );
40    }
41
42    /**
43     * @param MessageLocalizer $messageLocalizer
44     * @param Title $targetTitle Final local title of imported file
45     * @param UserIdentity $user
46     */
47    public function getHtml( MessageLocalizer $messageLocalizer, Title $targetTitle, UserIdentity $user ): string {
48        $importResult = $this->cache->fetchImportResult( $targetTitle, $user );
49        // This can happen when the user reloads a URL that still contains fileImporterSuccess=1
50        if ( !$importResult ) {
51            return '';
52        }
53
54        $html = '';
55
56        /** @var string|array|MessageSpecifier|null $spec */
57        $spec = $importResult->getValue();
58        if ( $spec ) {
59            // This reimplements Message::newFromSpecifier, but that wouldn't allow us to reuse the
60            // Language from the provided MessageLocalizer.
61            $msg = $messageLocalizer->msg( ...is_array( $spec ) ? $spec : [ $spec ] );
62            $html .= new MessageWidget( [
63                'label' => new HtmlSnippet( $msg->parse() ),
64                'type' => 'success',
65            ] );
66        }
67        foreach ( $importResult->getMessages( 'error' ) as $msg ) {
68            $html .= new MessageWidget( [
69                'label' => new HtmlSnippet( $messageLocalizer->msg( $msg )->parse() ),
70                'type' => 'error'
71            ] );
72        }
73        foreach ( $importResult->getMessages( 'warning' ) as $msg ) {
74            $html .= new MessageWidget( [
75                'label' => new HtmlSnippet( $messageLocalizer->msg( $msg )->parse() ),
76                'type' => 'warning',
77            ] );
78        }
79
80        return Html::rawElement( 'div', [ 'class' => 'mw-ext-fileimporter-noticebox' ], $html );
81    }
82
83}