PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.0.3
GiveWP – Donation Plugin and Fundraising Platform v3.0.3
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / MultiFormGoals / resources / js / components / server-side-render-x / index.js
give / src / MultiFormGoals / resources / js / components / server-side-render-x Last commit date
index.js 4 years ago
index.js
140 lines
1 /**
2 * NOTE: This is a fork of the original ServerSideRenderX component.
3 * You can find more about that project here: https://github.com/dgwyer/server-side-render-x
4 *
5 * Changes:
6 * - some minor clean up was done to remove references to variables which were never actually used.
7 */
8
9 /**
10 * External dependencies
11 */
12 import {isEqual, debounce} from 'lodash';
13
14 /**
15 * WordPress dependencies
16 */
17 const {Component, RawHTML, Fragment} = wp.element;
18 import { __ } from '@wordpress/i18n'
19 const apiFetch = wp.apiFetch;
20 const {addQueryArgs} = wp.url;
21 const {Placeholder} = wp.components;
22
23 export function rendererPath(block, attributes = null, urlQueryArgs = {}) {
24 return addQueryArgs(`/wp/v2/block-renderer/${block}`, {
25 context: 'edit',
26 ...(null !== attributes ? {attributes} : {}),
27 ...urlQueryArgs,
28 });
29 }
30
31 export class ServerSideRenderX extends Component {
32 constructor(props) {
33 super(props);
34 this.state = {
35 response: null,
36 prevResponse: null,
37 };
38 }
39
40 componentDidMount() {
41 this.isStillMounted = true;
42 this.fetch(this.props);
43 // Only debounce once the initial fetch occurs to ensure that the first
44 // renders show data as soon as possible.
45 this.fetch = debounce(this.fetch, 500);
46 }
47
48 componentWillUnmount() {
49 this.isStillMounted = false;
50 }
51
52 componentDidUpdate(prevProps) {
53 if (!isEqual(prevProps, this.props)) {
54 this.fetch(this.props);
55 }
56 }
57
58 fetch(props) {
59 if (!this.isStillMounted) {
60 return;
61 }
62 if (null !== this.state.response) {
63 this.setState((state) => ({
64 response: null,
65 prevResponse: state.response,
66 }));
67 }
68 const {block, attributes = null, urlQueryArgs = {}} = props;
69
70 const path = rendererPath(block, attributes, urlQueryArgs);
71 // Store the latest fetch request so that when we process it, we can
72 // check if it is the current request, to avoid race conditions on slow networks.
73 const fetchRequest = (this.currentFetchRequest = apiFetch({path})
74 .then((response) => {
75 if (this.isStillMounted && fetchRequest === this.currentFetchRequest && response) {
76 this.setState({response: response.rendered});
77 }
78 })
79 .catch((error) => {
80 if (this.isStillMounted && fetchRequest === this.currentFetchRequest) {
81 this.setState({
82 response: {
83 error: true,
84 errorMsg: error.message,
85 },
86 });
87 }
88 }));
89 return fetchRequest;
90 }
91
92 render() {
93 const {right, top, unit} = this.props.spinnerLocation;
94 const response = this.state.response;
95 const prevResponse = this.state.prevResponse;
96 let prevResponseHTML = '';
97 if (prevResponse !== null) {
98 prevResponseHTML = `<div style="position:relative;"><div style="position:absolute;right:${right}${unit};top:${top}${unit};z-index:1"><span class="components-spinner"></span></div>${prevResponse}</div>`;
99 }
100
101 const {className, EmptyResponsePlaceholder, ErrorResponsePlaceholder} = this.props;
102
103 if (response === '') {
104 return <EmptyResponsePlaceholder response={response} {...this.props} />;
105 } else if (!response) {
106 return (
107 <Fragment>
108 <RawHTML key="html" className={className}>
109 {prevResponseHTML}
110 </RawHTML>
111 </Fragment>
112 );
113 } else if (response.error) {
114 return <ErrorResponsePlaceholder response={response} {...this.props} />;
115 }
116
117 return (
118 <RawHTML key="html" className={className}>
119 {response}
120 </RawHTML>
121 );
122 }
123 }
124
125 ServerSideRenderX.defaultProps = {
126 EmptyResponsePlaceholder: ({className}) => (
127 <Placeholder className={className}>{__('Block rendered as empty.')}</Placeholder>
128 ),
129 ErrorResponsePlaceholder: ({response, className}) => {
130 const errorMessage = sprintf(
131 // translators: %s: error message describing the problem
132 __('Error loading block: %s'),
133 response.errorMsg
134 );
135 return <Placeholder className={className}>{errorMessage}</Placeholder>;
136 },
137 };
138
139 export default ServerSideRenderX;
140