Completed
Push — master ( 22116b...95cc86 )
by Stephanie
15:20 queued 12:54
created

FrmReviews   A

Complexity

Total Complexity 23

Size/Duplication

Total Lines 176
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
dl 0
loc 176
rs 10
c 0
b 0
f 0
wmc 23
lcom 1
cbo 3

7 Methods

Rating   Name   Duplication   Size   Complexity  
B review_request() 0 22 7
A set_review_status() 0 18 2
B review() 0 47 5
A add_to_inbox() 0 15 1
A set_inbox_dismissed() 0 4 1
A set_inbox_read() 0 4 1
B dismiss_review() 0 25 6
1
<?php
2
3
class FrmReviews {
4
5
	private $option_name = 'frm_reviewed';
6
7
	private $review_status = array();
8
9
	private $inbox_key = 'review';
10
11
	/**
12
	 * Add admin notices as needed for reviews
13
	 *
14
	 * @since 3.04.03
15
	 */
16
	public function review_request() {
17
18
		// Only show the review request to high-level users on Formidable pages
19
		if ( ! current_user_can( 'frm_change_settings' ) || ! FrmAppHelper::is_formidable_admin() ) {
20
			return;
21
		}
22
23
		// Verify that we can do a check for reviews
24
		$this->set_review_status();
25
26
		// Check if it has been dismissed or if we can ask later
27
		$dismissed = $this->review_status['dismissed'];
28
		if ( $dismissed === 'later' && $this->review_status['asked'] < 3 ) {
29
			$dismissed = false;
30
		}
31
32
		$week_ago = ( $this->review_status['time'] + WEEK_IN_SECONDS ) <= time();
33
34
		if ( empty( $dismissed ) && $week_ago ) {
35
			$this->review();
36
		}
37
	}
38
39
	/**
40
	 * When was the review request last dismissed?
41
	 *
42
	 * @since 3.04.03
43
	 */
44
	private function set_review_status() {
45
		$user_id = get_current_user_id();
46
		$review  = get_user_meta( $user_id, $this->option_name, true );
47
		$default = array(
48
			'time'      => time(),
49
			'dismissed' => false,
50
			'asked'     => 0,
51
		);
52
53
		if ( empty( $review ) ) {
54
			// Set the review request to show in a week
55
			update_user_meta( $user_id, $this->option_name, $default );
56
		}
57
58
		$review              = array_merge( $default, (array) $review );
59
		$review['asked']     = (int) $review['asked'];
60
		$this->review_status = $review;
61
	}
62
63
	/**
64
	 * Maybe show review request
65
	 *
66
	 * @since 3.04.03
67
	 */
68
	private function review() {
69
70
		// show the review request 3 times, depending on the number of entries
71
		$show_intervals = array( 50, 200, 500 );
72
		$asked          = $this->review_status['asked'];
73
74
		if ( ! isset( $show_intervals[ $asked ] ) ) {
75
			return;
76
		}
77
78
		$entries = FrmEntry::getRecordCount();
79
		$count   = $show_intervals[ $asked ];
80
		$user    = wp_get_current_user();
81
82
		// Only show review request if the site has collected enough entries
83
		if ( $entries < $count ) {
84
			// check the entry count again in a week
85
			$this->review_status['time'] = time();
86
			update_user_meta( $user->ID, $this->option_name, $this->review_status );
87
88
			return;
89
		}
90
91
		if ( $entries <= 100 ) {
92
			// round to the nearest 10
93
			$entries = floor( $entries / 10 ) * 10;
94
		} else {
95
			// round to the nearest 50
96
			$entries = floor( $entries / 50 ) * 50;
97
		}
98
		$name = $user->first_name;
99
		if ( ! empty( $name ) ) {
100
			$name = ' ' . $name;
101
		}
102
103
		$title = sprintf(
104
			/* translators: %s: User name, %2$d: number of entries */
105
			esc_html__( 'Congratulations%1$s! You have collected %2$d form submissions.', 'formidable' ),
106
			esc_html( $name ),
107
			absint( $entries )
108
		);
109
110
		$this->add_to_inbox( $title );
111
112
		// We have a candidate! Output a review message.
113
		include( FrmAppHelper::plugin_path() . '/classes/views/shared/review.php' );
114
	}
115
116
	private function add_to_inbox( $title ) {
117
		$message = new FrmInbox();
118
		$message->add_message(
119
			array(
120
				'key'     => $this->inbox_key,
121
				'force'   => true,
122
				'message' => __( 'If you are enjoying Formidable, could you do me a BIG favor and give us a review to help me grow my little business and boost our motivation?', 'formidable' ) . '<br/>' .
123
					'- Steph Wells<br/>' .
124
					'<span>' . esc_html__( 'Founder and Lead Developer of Formidable Forms', 'formidable' ) . '<span>',
125
				'subject' => $title,
126
				'cta'     => '<a href="https://wordpress.org/support/plugin/formidable/reviews/?filter=5#new-post" class="frm-dismiss-review-notice frm-review-out button-secondary frm-button-secondary" data-link="yes" target="_blank" rel="noopener noreferrer">' .
127
					esc_html__( 'Ok, you deserve it', 'formidable' ) . '</a>',
128
			)
129
		);
130
	}
131
132
	/**
133
	 * @since 4.05.01
134
	 */
135
	private function set_inbox_dismissed() {
136
		$message = new FrmInbox();
137
		$message->dismiss( $this->inbox_key );
138
	}
139
140
	/**
141
	 * @since 4.05.01
142
	 */
143
	private function set_inbox_read() {
144
		$message = new FrmInbox();
145
		$message->mark_read( $this->inbox_key );
146
	}
147
148
	/**
149
	 * Save the request to hide the review
150
	 *
151
	 * @since 3.04.03
152
	 */
153
	public function dismiss_review() {
154
		FrmAppHelper::permission_check( 'frm_change_settings' );
155
		check_ajax_referer( 'frm_ajax', 'nonce' );
156
157
		$user_id = get_current_user_id();
158
		$review  = get_user_meta( $user_id, $this->option_name, true );
159
		if ( empty( $review ) ) {
160
			$review = array();
161
		}
162
163
		if ( isset( $review['dismissed'] ) && $review['dismissed'] === 'done' ) {
164
			// if feedback was submitted, don't update it again when the review is dismissed
165
			$this->set_inbox_dismissed();
166
			wp_die();
167
		}
168
169
		$dismissed           = FrmAppHelper::get_post_param( 'link', 'no', 'sanitize_text_field' );
170
		$review['time']      = time();
171
		$review['dismissed'] = $dismissed === 'done' ? true : 'later';
172
		$review['asked']     = isset( $review['asked'] ) ? $review['asked'] + 1 : 1;
173
174
		update_user_meta( $user_id, $this->option_name, $review );
175
		$this->set_inbox_read();
176
		wp_die();
177
	}
178
}
179