PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.6.1
GiveWP – Donation Plugin and Fundraising Platform v4.6.1
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 1 year ago
index.js
139 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 {
102 className,
103 EmptyResponsePlaceholder = ({className}) => (
104 <Placeholder className={className}>{__('Block rendered as empty.')}</Placeholder>
105 ),
106 ErrorResponsePlaceholder = ({response, className}) => {
107 const errorMessage = sprintf(
108 // translators: %s: error message describing the problem
109 __('Error loading block: %s'),
110 response.errorMsg
111 );
112 return <Placeholder className={className}>{errorMessage}</Placeholder>;
113 },
114 } = this.props;
115
116 if (response === '') {
117 return <EmptyResponsePlaceholder response={response} {...this.props} />;
118 } else if (!response) {
119 return (
120 <Fragment>
121 <RawHTML key="html" className={className}>
122 {prevResponseHTML}
123 </RawHTML>
124 </Fragment>
125 );
126 } else if (response.error) {
127 return <ErrorResponsePlaceholder response={response} {...this.props} />;
128 }
129
130 return (
131 <RawHTML key="html" className={className}>
132 {response}
133 </RawHTML>
134 );
135 }
136 }
137
138 export default ServerSideRenderX;
139