handleSubmission(); $title = __( 'اتصال به راهکار فروش', 'rahkar-toolkit' ); Ui::pageOpen( $title, __( 'سفارش‌های این فروشگاه را به داشبورد راهکار فروش می‌فرستد تا فروش و مشتری‌ها تحلیل شوند. تا وقتی کد اتصال را وارد نکنید، هیچ داده‌ای از این سایت خارج نمی‌شود.', 'rahkar-toolkit' ), Help::link( HubConnectorModule::SLUG, $title ) ); if ( null !== $result ) { echo wp_kses( Ui::notice( $result['ok'] ? 'success' : 'error', $result['message'] ), Ui::allowedHtml() ); } $credentials = Credentials::load(); if ( null === $credentials ) { $this->renderConnectForm(); } else { $this->renderStatus( $credentials ); } Ui::pageClose(); } /** * The pairing form. */ private function renderConnectForm(): void { Ui::panelOpen( __( 'وصل کردن فروشگاه', 'rahkar-toolkit' ), __( 'در پنل راهکار فروش، «افزودن فروشگاه» را بزنید و کد اتصال را اینجا وارد کنید. کد یک‌بار مصرف است و ۲۴ ساعت اعتبار دارد.', 'rahkar-toolkit' ), 'plug' ); if ( ! HubClient::urlIsAllowed() ) { echo wp_kses( Ui::notice( 'error', __( 'آدرس هاب در RAHKAR_HUB_URL باید HTTPS باشد.', 'rahkar-toolkit' ) ), Ui::allowedHtml() ); } Ui::formOpen(); wp_nonce_field( self::NONCE ); echo ''; Ui::toolbarOpen( false ); echo wp_kses( Ui::input( 'text', 'pairing_code', '', [ 'required' => '', 'autocomplete' => 'off', 'placeholder' => 'RF1-XXXX-XXXX-XXXX', ], true ), Ui::allowedHtml() ); echo wp_kses( Ui::button( __( 'اتصال', 'rahkar-toolkit' ), 'primary', [ 'type' => 'submit' ], '', 'plug' ), Ui::allowedHtml() ); Ui::toolbarClose(); Ui::formClose(); Ui::panelClose( wp_kses( Ui::badge( HubClient::baseUrl(), 'quiet', true ), Ui::allowedHtml() ) ); } /** * What is connected and how sending is going. * * @param Credentials $credentials Stored credentials. */ private function renderStatus( Credentials $credentials ): void { $state = new State(); $counts = Outbox::counts(); $status = $state->status(); $labels = [ State::OK => [ __( 'در حال ارسال', 'rahkar-toolkit' ), 'success' ], State::PAUSED => [ __( 'اشتراک معلق است', 'rahkar-toolkit' ), 'warning' ], State::AUTH_FAILED => [ __( 'کلید پذیرفته نشد', 'rahkar-toolkit' ), 'error' ], State::SITE_MISMATCH => [ __( 'آدرس سایت عوض شده', 'rahkar-toolkit' ), 'error' ], State::UPGRADE_REQUIRED => [ __( 'افزونه را به‌روز کنید', 'rahkar-toolkit' ), 'error' ], ]; [ $label, $variant ] = $labels[ $status ] ?? $labels[ State::OK ]; $lastSent = (int) $state->get( 'last_sent', 0 ); Ui::statsOpen(); echo wp_kses( Ui::stat( $label, __( 'وضعیت', 'rahkar-toolkit' ), '', 'success' === $variant ? 'success' : 'error' ), Ui::allowedHtml() ); echo wp_kses( Ui::stat( number_format_i18n( $counts['pending'] ), __( 'در صف ارسال', 'rahkar-toolkit' ) ), Ui::allowedHtml() ); echo wp_kses( Ui::stat( $lastSent > 0 ? sprintf( /* translators: %s: human time difference */ __( '%s پیش', 'rahkar-toolkit' ), human_time_diff( $lastSent ) ) : '—', __( 'آخرین ارسال موفق', 'rahkar-toolkit' ) ), Ui::allowedHtml() ); echo wp_kses( Ui::stat( $this->backfillLabel( $state ), __( 'ارسال تاریخچه', 'rahkar-toolkit' ) ), Ui::allowedHtml() ); Ui::statsClose(); $error = (string) $state->get( 'last_error', '' ); if ( '' !== $error ) { echo wp_kses( Ui::notice( State::OK === $status ? 'warning' : 'error', $error, __( 'آخرین خطا', 'rahkar-toolkit' ) ), Ui::allowedHtml() ); } if ( $counts['dead'] > 0 ) { echo wp_kses( Ui::notice( 'warning', /* translators: %s: number of events */ sprintf( __( '%s رویداد را هاب نپذیرفت و کنار گذاشته شد. جزئیات در گزارش‌ها، کانال hub.', 'rahkar-toolkit' ), number_format_i18n( $counts['dead'] ) ) ), Ui::allowedHtml() ); } Ui::panelOpen( __( 'اتصال', 'rahkar-toolkit' ), '', 'plug' ); Ui::rowOpen( __( 'شناسه‌ی فروشگاه', 'rahkar-toolkit' ) ); echo wp_kses( Ui::badge( $credentials->storeId, 'quiet', true ), Ui::allowedHtml() ); Ui::rowClose(); Ui::rowOpen( __( 'هاب', 'rahkar-toolkit' ) ); echo wp_kses( Ui::badge( HubClient::baseUrl(), 'quiet', true ), Ui::allowedHtml() ); Ui::rowClose(); Ui::toolbarOpen( false ); Ui::formOpen(); wp_nonce_field( self::NONCE ); echo ''; echo wp_kses( Ui::button( __( 'بررسی اتصال', 'rahkar-toolkit' ), 'secondary', [ 'type' => 'submit' ], '', 'check' ), Ui::allowedHtml() ); Ui::formClose(); echo wp_kses( Ui::toolbarSpacer(), Ui::allowedHtml() ); printf( '
', wp_kses( Ui::confirmAttrs( __( 'قطع اتصال', 'rahkar-toolkit' ), __( 'کلید اتصال و رویدادهای ارسال‌نشده از این سایت پاک می‌شوند و دیگر چیزی به راهکار فروش فرستاده نمی‌شود.', 'rahkar-toolkit' ), __( 'قطع اتصال', 'rahkar-toolkit' ), 'danger' ), Ui::allowedHtml() ) ); wp_nonce_field( self::NONCE ); echo ''; echo wp_kses( Ui::button( __( 'قطع اتصال', 'rahkar-toolkit' ), 'destructive', [ 'type' => 'submit' ] ), Ui::allowedHtml() ); echo '
'; Ui::toolbarClose(); Ui::panelClose(); Ui::confirmModal(); Ui::enqueueConfirm(); } /** * Where the history upload stands, in words. * * @param State $state Connector state. */ private function backfillLabel( State $state ): string { if ( 'done' === $state->get( 'backfill_state' ) ) { return __( 'کامل', 'rahkar-toolkit' ); } $names = [ 'category' => __( 'دسته‌ها', 'rahkar-toolkit' ), 'product' => __( 'محصولات', 'rahkar-toolkit' ), 'customer' => __( 'مشتری‌ها', 'rahkar-toolkit' ), 'coupon' => __( 'کوپن‌ها', 'rahkar-toolkit' ), 'order' => __( 'سفارش‌ها', 'rahkar-toolkit' ), ]; $entity = (string) $state->get( 'backfill_entity', '' ); if ( ! isset( $names[ $entity ] ) ) { return '—'; } /* translators: 1: entity name, 2: number of items sent so far */ return sprintf( __( '%1$s (%2$s)', 'rahkar-toolkit' ), $names[ $entity ], number_format_i18n( (int) $state->get( 'backfill_done', 0 ) ) ); } /** * Apply a connect, check or disconnect. * * @return array{ok: bool, message: string}|null */ private function handleSubmission(): ?array { if ( ! isset( $_POST['rahkar_hub_action'] ) ) { return null; } check_admin_referer( self::NONCE ); $action = sanitize_key( wp_unslash( $_POST['rahkar_hub_action'] ) ); $connector = new Connector(); if ( 'connect' === $action ) { return $connector->connect( sanitize_text_field( wp_unslash( $_POST['pairing_code'] ?? '' ) ) ); } if ( 'disconnect' === $action ) { return $connector->disconnect(); } if ( 'check' === $action ) { $remote = $connector->remoteStatus(); return null === $remote ? [ 'ok' => false, 'message' => __( 'هاب پاسخ نداد یا این فروشگاه را نشناخت. آخرین خطا را پایین ببینید.', 'rahkar-toolkit' ), ] : [ 'ok' => true, /* translators: %s: store name on the hub */ 'message' => sprintf( __( 'هاب این سایت را به‌عنوان «%s» می‌شناسد.', 'rahkar-toolkit' ), (string) ( $remote['name'] ?? '' ) ), ]; } return null; } }