From 0d016b94eceb88dfc95a3857f7643c031c52015d Mon Sep 17 00:00:00 2001 From: Alex P Date: Tue, 5 Dec 2023 21:32:32 +0200 Subject: [PATCH 01/39] Add paylater-block module --- modules.php | 1 + modules/ppcp-paylater-block/.babelrc | 14 + modules/ppcp-paylater-block/.gitignore | 3 + modules/ppcp-paylater-block/composer.json | 17 + modules/ppcp-paylater-block/extensions.php | 12 + modules/ppcp-paylater-block/module.php | 16 + modules/ppcp-paylater-block/package.json | 33 + modules/ppcp-paylater-block/services.php | 14 + .../src/PayLaterBlockModule.php | 44 + modules/ppcp-paylater-block/webpack.config.js | 37 + modules/ppcp-paylater-block/yarn.lock | 2201 +++++++++++++++++ package.json | 3 + 12 files changed, 2395 insertions(+) create mode 100644 modules/ppcp-paylater-block/.babelrc create mode 100644 modules/ppcp-paylater-block/.gitignore create mode 100644 modules/ppcp-paylater-block/composer.json create mode 100644 modules/ppcp-paylater-block/extensions.php create mode 100644 modules/ppcp-paylater-block/module.php create mode 100644 modules/ppcp-paylater-block/package.json create mode 100644 modules/ppcp-paylater-block/services.php create mode 100644 modules/ppcp-paylater-block/src/PayLaterBlockModule.php create mode 100644 modules/ppcp-paylater-block/webpack.config.js create mode 100644 modules/ppcp-paylater-block/yarn.lock diff --git a/modules.php b/modules.php index 33a15fc3b..33a42406d 100644 --- a/modules.php +++ b/modules.php @@ -28,6 +28,7 @@ return function ( string $root_dir ): iterable { ( require "$modules_dir/ppcp-uninstall/module.php" )(), ( require "$modules_dir/ppcp-blocks/module.php" )(), ( require "$modules_dir/ppcp-paypal-subscriptions/module.php" )(), + ( require "$modules_dir/ppcp-paylater-block/module.php" )(), ); if ( apply_filters( // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores diff --git a/modules/ppcp-paylater-block/.babelrc b/modules/ppcp-paylater-block/.babelrc new file mode 100644 index 000000000..822778e6c --- /dev/null +++ b/modules/ppcp-paylater-block/.babelrc @@ -0,0 +1,14 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "useBuiltIns": "usage", + "corejs": "3.25.0" + } + ], + [ + "@babel/preset-react" + ] + ] +} diff --git a/modules/ppcp-paylater-block/.gitignore b/modules/ppcp-paylater-block/.gitignore new file mode 100644 index 000000000..0bd2b9f58 --- /dev/null +++ b/modules/ppcp-paylater-block/.gitignore @@ -0,0 +1,3 @@ +node_modules +assets/js +assets/css diff --git a/modules/ppcp-paylater-block/composer.json b/modules/ppcp-paylater-block/composer.json new file mode 100644 index 000000000..58b7a5545 --- /dev/null +++ b/modules/ppcp-paylater-block/composer.json @@ -0,0 +1,17 @@ +{ + "name": "woocommerce/ppcp-paylater-block", + "type": "dhii-mod", + "description": "Pay Later Block module for PPCP", + "license": "GPL-2.0", + "require": { + "php": "^7.2 | ^8.0", + "dhii/module-interface": "^0.3.0-alpha1" + }, + "autoload": { + "psr-4": { + "WooCommerce\\PayPalCommerce\\PayLaterBlock\\": "src" + } + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/modules/ppcp-paylater-block/extensions.php b/modules/ppcp-paylater-block/extensions.php new file mode 100644 index 000000000..81939c6f5 --- /dev/null +++ b/modules/ppcp-paylater-block/extensions.php @@ -0,0 +1,12 @@ + 0.5%", + "Safari >= 8", + "Chrome >= 41", + "Firefox >= 43", + "Edge >= 14" + ], + "dependencies": { + "core-js": "^3.25.0" + }, + "devDependencies": { + "@babel/core": "^7.19", + "@babel/preset-env": "^7.19", + "@babel/preset-react": "^7.18.6", + "@woocommerce/dependency-extraction-webpack-plugin": "^2.2.0", + "babel-loader": "^8.2", + "cross-env": "^7.0.3", + "file-loader": "^6.2.0", + "sass": "^1.42.1", + "sass-loader": "^12.1.0", + "webpack": "^5.76", + "webpack-cli": "^4.10" + }, + "scripts": { + "build": "cross-env BABEL_ENV=default NODE_ENV=production webpack", + "watch": "cross-env BABEL_ENV=default NODE_ENV=production webpack --watch", + "dev": "cross-env BABEL_ENV=default webpack --watch" + } +} diff --git a/modules/ppcp-paylater-block/services.php b/modules/ppcp-paylater-block/services.php new file mode 100644 index 000000000..414e9b8da --- /dev/null +++ b/modules/ppcp-paylater-block/services.php @@ -0,0 +1,14 @@ +=3.0.0 <4.0.0": + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +colorette@^2.0.14: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +core-js-compat@^3.25.1: + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" + integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== + dependencies: + browserslist "^4.21.4" + +core-js@^3.25.0: + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.1.tgz#7a9816dabd9ee846c1c0fe0e8fcad68f3709134e" + integrity sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA== + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.1, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +immutable@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" + integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json2php@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/json2php/-/json2php-0.0.4.tgz#6bd85a1dda6a5dd7e91022bb24403cc1b7c2ee34" + integrity sha512-hFzejhs28f70sGnutcsRS459MnAsjRVI85RgPAL1KQIZEpjiDitc27CZv4IgOtaR86vrqOVlu9vJNew2XyTH4g== + +json5@^2.1.2, json5@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klona@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" + integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsgen "^0.7.1" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsgen@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" + integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.14.2, resolve@^1.9.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +sass-loader@^12.1.0: + version "12.6.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sass@^1.42.1: + version "1.56.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.1.tgz#94d3910cd468fd075fa87f5bb17437a0b617d8a7" + integrity sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +"source-map-js@>=0.6.2 <2.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3: + version "5.3.6" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" + integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.14" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.14.1" + +terser@^5.14.1: + version "5.16.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" + integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webpack-cli@^4.10: + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" + colorette "^2.0.14" + commander "^7.0.0" + cross-spawn "^7.0.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.2, webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.76: + version "5.76.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.0.tgz#f9fb9fb8c4a7dbdcd0d56a98e56b8a942ee2692c" + integrity sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== diff --git a/package.json b/package.json index 943b26caa..d8a877880 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "postinstall": "run-s install:modules:* && run-s build:modules", "install:modules:ppcp-applepay": "cd modules/ppcp-applepay && yarn install", "install:modules:ppcp-blocks": "cd modules/ppcp-blocks && yarn install", + "install:modules:ppcp-paylater-block": "cd modules/ppcp-paylater-block && yarn install", "install:modules:ppcp-button": "cd modules/ppcp-button && yarn install", "install:modules:ppcp-googlepay": "cd modules/ppcp-googlepay && yarn install", "install:modules:ppcp-wc-gateway": "cd modules/ppcp-wc-gateway && yarn install", @@ -21,6 +22,7 @@ "install:modules:ppcp-uninstall": "cd modules/ppcp-uninstall && yarn install", "build:modules:ppcp-applepay": "cd modules/ppcp-applepay && yarn run build", "build:modules:ppcp-blocks": "cd modules/ppcp-blocks && yarn run build", + "build:modules:ppcp-paylater-block": "cd modules/ppcp-paylater-block && yarn run build", "build:modules:ppcp-button": "cd modules/ppcp-button && yarn run build", "build:modules:ppcp-googlepay": "cd modules/ppcp-googlepay && yarn run build", "build:modules:ppcp-wc-gateway": "cd modules/ppcp-wc-gateway && yarn run build", @@ -34,6 +36,7 @@ "build:modules": "run-p build:modules:*", "watch:modules:ppcp-applepay": "cd modules/ppcp-applepay && yarn run watch", "watch:modules:ppcp-blocks": "cd modules/ppcp-blocks && yarn run watch", + "watch:modules:ppcp-paylater-block": "cd modules/ppcp-paylater-block && yarn run watch", "watch:modules:ppcp-button": "cd modules/ppcp-button && yarn run watch", "watch:modules:ppcp-googlepay": "cd modules/ppcp-googlepay && yarn run watch", "watch:modules:ppcp-wc-gateway": "cd modules/ppcp-wc-gateway && yarn run watch", From 9ded2bfa172aeabd2a2515f66fe0d09878ea642e Mon Sep 17 00:00:00 2001 From: Alex P Date: Tue, 5 Dec 2023 21:35:18 +0200 Subject: [PATCH 02/39] Add pay later block --- modules/ppcp-paylater-block/block.json | 42 +++++++ modules/ppcp-paylater-block/package.json | 1 + .../resources/css/edit.scss | 13 ++ .../ppcp-paylater-block/resources/js/edit.js | 113 ++++++++++++++++++ .../resources/js/paylater-block.js | 9 ++ .../ppcp-paylater-block/resources/js/save.js | 21 ++++ .../src/PayLaterBlockModule.php | 11 ++ modules/ppcp-paylater-block/webpack.config.js | 2 + modules/ppcp-paylater-block/yarn.lock | 32 +++++ 9 files changed, 244 insertions(+) create mode 100644 modules/ppcp-paylater-block/block.json create mode 100644 modules/ppcp-paylater-block/resources/css/edit.scss create mode 100644 modules/ppcp-paylater-block/resources/js/edit.js create mode 100644 modules/ppcp-paylater-block/resources/js/paylater-block.js create mode 100644 modules/ppcp-paylater-block/resources/js/save.js diff --git a/modules/ppcp-paylater-block/block.json b/modules/ppcp-paylater-block/block.json new file mode 100644 index 000000000..b900a160e --- /dev/null +++ b/modules/ppcp-paylater-block/block.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "woocommerce-paypal-payments/paylater-messages", + "version": "1.0.0", + "title": "PayPal Pay Later messages", + "category": "widgets", + "description": "Pay Later", + "example": {}, + "attributes": { + "layout": { + "type": "string", + "default": "flex" + }, + "logo": { + "type": "string", + "default": "inline" + }, + "position": { + "type": "string", + "default": "left" + }, + "color": { + "type": "string", + "default": "black" + }, + "flexColor": { + "type": "string", + "default": "white" + }, + "flexRatio": { + "type": "string", + "default": "8x1" + } + }, + "supports": { + "html": false + }, + "textdomain": "woocommerce-paypal-payments", + "editorScript": "file:./assets/js/paylater-block.js", + "editorStyle": "file:./assets/css/edit.css" +} diff --git a/modules/ppcp-paylater-block/package.json b/modules/ppcp-paylater-block/package.json index c88508afe..711ad6549 100644 --- a/modules/ppcp-paylater-block/package.json +++ b/modules/ppcp-paylater-block/package.json @@ -10,6 +10,7 @@ "Edge >= 14" ], "dependencies": { + "@paypal/react-paypal-js": "^8.1.3", "core-js": "^3.25.0" }, "devDependencies": { diff --git a/modules/ppcp-paylater-block/resources/css/edit.scss b/modules/ppcp-paylater-block/resources/css/edit.scss new file mode 100644 index 000000000..010b2fd6c --- /dev/null +++ b/modules/ppcp-paylater-block/resources/css/edit.scss @@ -0,0 +1,13 @@ +.ppcp-overlay-parent { + display: grid; + grid-template-columns: 1fr; +} + +.ppcp-overlay-child { + grid-row-start: 1; + grid-column-start: 1; +} + +.ppcp-unclicable-overlay { + z-index: 10; +} diff --git a/modules/ppcp-paylater-block/resources/js/edit.js b/modules/ppcp-paylater-block/resources/js/edit.js new file mode 100644 index 000000000..0b000474a --- /dev/null +++ b/modules/ppcp-paylater-block/resources/js/edit.js @@ -0,0 +1,113 @@ +import { __ } from '@wordpress/i18n'; +import { InspectorControls, useBlockProps } from '@wordpress/block-editor'; +import { PanelBody, SelectControl } from '@wordpress/components'; +import { PayPalScriptProvider, PayPalMessages } from "@paypal/react-paypal-js"; + +export default function Edit( { attributes, setAttributes } ) { + const { layout, logo, position, color, flexColor, flexRatio } = attributes; + const isFlex = layout === 'flex'; + + const previewStyle = { + layout, + logo: { + position, + type: logo, + }, + color: flexColor, + ratio: flexRatio, + text: { + color, + }, + }; + return ( + <> + + + setAttributes( { layout: value } ) } + /> + { !isFlex && ( setAttributes({logo: value})} + />)} + { !isFlex && ( setAttributes({position: value})} + />)} + { !isFlex && ( setAttributes({color: value})} + />)} + { isFlex && ( setAttributes({flexColor: value})} + />)} + { isFlex && ( setAttributes({flexRatio: value})} + />)} + + +
+
+ + + +
+
{/* make the message not clickable */} +
+
+ + ); +} diff --git a/modules/ppcp-paylater-block/resources/js/paylater-block.js b/modules/ppcp-paylater-block/resources/js/paylater-block.js new file mode 100644 index 000000000..40692d3cc --- /dev/null +++ b/modules/ppcp-paylater-block/resources/js/paylater-block.js @@ -0,0 +1,9 @@ +import { registerBlockType } from '@wordpress/blocks'; + +import Edit from './edit'; +import save from './save'; + +registerBlockType( 'woocommerce-paypal-payments/paylater-messages', { + edit: Edit, + save, +} ); diff --git a/modules/ppcp-paylater-block/resources/js/save.js b/modules/ppcp-paylater-block/resources/js/save.js new file mode 100644 index 000000000..e1db30d8f --- /dev/null +++ b/modules/ppcp-paylater-block/resources/js/save.js @@ -0,0 +1,21 @@ +import { useBlockProps } from '@wordpress/block-editor'; + +export default function save( { attributes } ) { + const { layout, logo, position, color, flexColor, flexRatio } = attributes; + const dataAttributes = layout === 'flex' ? { + 'data-pp-style-layout': 'flex', + 'data-pp-style-color': flexColor, + 'data-pp-style-ratio': flexRatio, + } : { + 'data-pp-style-layout': 'text', + 'data-pp-style-logo-type': logo, + 'data-pp-style-logo-position': position, + 'data-pp-style-text-color': color, + }; + const props = { + className: 'ppcp-paylater-message-block', + ...dataAttributes, + }; + + return
; +} diff --git a/modules/ppcp-paylater-block/src/PayLaterBlockModule.php b/modules/ppcp-paylater-block/src/PayLaterBlockModule.php index c66fec46e..25d9050ac 100644 --- a/modules/ppcp-paylater-block/src/PayLaterBlockModule.php +++ b/modules/ppcp-paylater-block/src/PayLaterBlockModule.php @@ -32,6 +32,17 @@ class PayLaterBlockModule implements ModuleInterface { * {@inheritDoc} */ public function run( ContainerInterface $c ): void { + add_action( + 'init', + function (): void { + /** + * Cannot return false for this path. + * + * @psalm-suppress PossiblyFalseArgument + */ + register_block_type( dirname( realpath( __FILE__ ), 2 ) ); + } + ); } /** diff --git a/modules/ppcp-paylater-block/webpack.config.js b/modules/ppcp-paylater-block/webpack.config.js index 12f344299..512da2177 100644 --- a/modules/ppcp-paylater-block/webpack.config.js +++ b/modules/ppcp-paylater-block/webpack.config.js @@ -9,6 +9,8 @@ module.exports = { target: 'web', plugins: [ new DependencyExtractionWebpackPlugin() ], entry: { + 'paylater-block': path.resolve('./resources/js/paylater-block.js'), + 'edit': path.resolve('./resources/css/edit.scss'), }, output: { path: path.resolve(__dirname, 'assets/'), diff --git a/modules/ppcp-paylater-block/yarn.lock b/modules/ppcp-paylater-block/yarn.lock index 209adc4a4..d6b9c3600 100644 --- a/modules/ppcp-paylater-block/yarn.lock +++ b/modules/ppcp-paylater-block/yarn.lock @@ -1005,6 +1005,28 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@paypal/paypal-js@^7.0.0": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@paypal/paypal-js/-/paypal-js-7.1.1.tgz#3547cbb96f1692209c4b33cf0f8e69225c2e84a3" + integrity sha512-fVpExBrHINGHsyODYKBXSMinxrgPKzmVW7ZCaCqUaMl7kTSR1ZsVi2IhgLvsPpXF4LWSAMkPTP/J6aetQ6ZlNA== + dependencies: + promise-polyfill "^8.3.0" + +"@paypal/react-paypal-js@^8.1.3": + version "8.1.3" + resolved "https://registry.yarnpkg.com/@paypal/react-paypal-js/-/react-paypal-js-8.1.3.tgz#2a46bd864eee02efada370ca50fab5a5bf38f4ff" + integrity sha512-hEm27iYP/UHS3XPBhDdiK2U4PH1FxrOD5O3f9tstAVLJd82l/laCjq751HiESSm63PVOoFeKE41Fe1mYGab+oA== + dependencies: + "@paypal/paypal-js" "^7.0.0" + "@paypal/sdk-constants" "^1.0.122" + +"@paypal/sdk-constants@^1.0.122": + version "1.0.133" + resolved "https://registry.yarnpkg.com/@paypal/sdk-constants/-/sdk-constants-1.0.133.tgz#ee65c0bb574554becc8a5d3d0a834a944bbeb0e7" + integrity sha512-NWV0IWrHwQQrNLaUYxQ1GsytvHbDu+x63kRpNJfw1OQeDcUca4B0I4LoBktWQl5gICi090hD56n2Wg08dAl44g== + dependencies: + hi-base32 "^0.5.0" + "@types/eslint-scope@^3.7.3": version "3.7.4" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" @@ -1599,6 +1621,11 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hi-base32@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e" + integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== + immutable@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" @@ -1840,6 +1867,11 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +promise-polyfill@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.3.0.tgz#9284810268138d103807b11f4e23d5e945a4db63" + integrity sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg== + punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" From d8ff7f79e6f0aa6ba466d93f90f6d8b01157f449 Mon Sep 17 00:00:00 2001 From: Alex P Date: Tue, 5 Dec 2023 21:35:41 +0200 Subject: [PATCH 03/39] Add loading spinner --- modules/ppcp-paylater-block/resources/js/edit.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/ppcp-paylater-block/resources/js/edit.js b/modules/ppcp-paylater-block/resources/js/edit.js index 0b000474a..b98ee8224 100644 --- a/modules/ppcp-paylater-block/resources/js/edit.js +++ b/modules/ppcp-paylater-block/resources/js/edit.js @@ -1,12 +1,15 @@ import { __ } from '@wordpress/i18n'; +import { useState } from '@wordpress/element'; import { InspectorControls, useBlockProps } from '@wordpress/block-editor'; -import { PanelBody, SelectControl } from '@wordpress/components'; +import { PanelBody, SelectControl, Spinner } from '@wordpress/components'; import { PayPalScriptProvider, PayPalMessages } from "@paypal/react-paypal-js"; export default function Edit( { attributes, setAttributes } ) { const { layout, logo, position, color, flexColor, flexRatio } = attributes; const isFlex = layout === 'flex'; + const [loaded, setLoaded] = useState(false); + const previewStyle = { layout, logo: { @@ -102,10 +105,12 @@ export default function Edit( { attributes, setAttributes } ) { setLoaded(true)} />
{/* make the message not clickable */} + {!loaded && ()}
From baa3afeb9b30c8b92abcfdd5ef82a0c79ecb14f8 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 6 Dec 2023 17:31:56 +0200 Subject: [PATCH 04/39] Render pay later blocks --- .../ContextBootstrap/MessagesBootstap.js | 31 ++++++++++++------- .../js/modules/Renderer/MessageRenderer.js | 8 +++-- .../ppcp-button/src/Assets/SmartButton.php | 4 +++ modules/ppcp-paylater-block/block.json | 3 ++ .../ppcp-paylater-block/resources/js/edit.js | 13 ++++++-- .../ppcp-paylater-block/resources/js/save.js | 7 +++-- 6 files changed, 46 insertions(+), 20 deletions(-) diff --git a/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js b/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js index fe1c49438..be593e615 100644 --- a/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js +++ b/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js @@ -1,13 +1,18 @@ import {setVisible} from "../Helper/Hiding"; +import MessageRenderer from "../Renderer/MessageRenderer"; class MessagesBootstrap { constructor(gateway, messageRenderer) { this.gateway = gateway; - this.renderer = messageRenderer; + this.renderers = [messageRenderer]; this.lastAmount = this.gateway.messages.amount; } init() { + Array.from(document.querySelectorAll('.ppcp-paylater-message-block')).forEach(blockElement => { + this.renderers.push(new MessageRenderer({wrapper: '#' + blockElement.id})); + }); + jQuery(document.body).on('ppcp_cart_rendered ppcp_checkout_rendered', () => { this.render(); }); @@ -27,28 +32,30 @@ class MessagesBootstrap { this.render(); } - shouldShow() { + shouldShow(renderer) { if (this.gateway.messages.is_hidden === true) { return false; } const eventData = {result: true} - jQuery(document.body).trigger('ppcp_should_show_messages', [eventData]); + jQuery(document.body).trigger('ppcp_should_show_messages', [eventData, renderer.config.wrapper]); return eventData.result; } - shouldRender() { - return this.shouldShow() && this.renderer.shouldRender(); - } - render() { - setVisible(this.gateway.messages.wrapper, this.shouldShow()); + this.renderers.forEach(renderer => { + const shouldShow = this.shouldShow(renderer); + setVisible(renderer.config.wrapper, shouldShow); + if (!shouldShow) { + return; + } - if (!this.shouldRender()) { - return; - } + if (!renderer.shouldRender()) { + return; + } - this.renderer.renderWithAmount(this.lastAmount); + renderer.renderWithAmount(this.lastAmount); + }); } } diff --git a/modules/ppcp-button/resources/js/modules/Renderer/MessageRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/MessageRenderer.js index b1261a466..489202e56 100644 --- a/modules/ppcp-button/resources/js/modules/Renderer/MessageRenderer.js +++ b/modules/ppcp-button/resources/js/modules/Renderer/MessageRenderer.js @@ -15,9 +15,13 @@ class MessageRenderer { const options = { amount, - placement: this.config.placement, - style: this.config.style }; + if (this.config.placement) { + options.placement = this.config.placement; + } + if (this.config.style) { + options.style = this.config.style; + } // sometimes the element is destroyed while the options stay the same if (document.querySelector(this.config.wrapper).getAttribute('data-render-number') !== this.currentNumber.toString()) { diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index f6a646388..63d43dc70 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -620,6 +620,10 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages return false; } + if ( has_block( 'woocommerce-paypal-payments/paylater-messages' ) ) { + return true; + } + $location = $this->location(); $messaging_enabled_for_current_location = $this->settings_status->is_pay_later_messaging_enabled_for_location( $location ); diff --git a/modules/ppcp-paylater-block/block.json b/modules/ppcp-paylater-block/block.json index b900a160e..0c3d1b206 100644 --- a/modules/ppcp-paylater-block/block.json +++ b/modules/ppcp-paylater-block/block.json @@ -8,6 +8,9 @@ "description": "Pay Later", "example": {}, "attributes": { + "id": { + "type": "string" + }, "layout": { "type": "string", "default": "flex" diff --git a/modules/ppcp-paylater-block/resources/js/edit.js b/modules/ppcp-paylater-block/resources/js/edit.js index b98ee8224..ef38cb8cf 100644 --- a/modules/ppcp-paylater-block/resources/js/edit.js +++ b/modules/ppcp-paylater-block/resources/js/edit.js @@ -1,11 +1,11 @@ import { __ } from '@wordpress/i18n'; -import { useState } from '@wordpress/element'; +import { useState, useEffect } from '@wordpress/element'; import { InspectorControls, useBlockProps } from '@wordpress/block-editor'; import { PanelBody, SelectControl, Spinner } from '@wordpress/components'; import { PayPalScriptProvider, PayPalMessages } from "@paypal/react-paypal-js"; -export default function Edit( { attributes, setAttributes } ) { - const { layout, logo, position, color, flexColor, flexRatio } = attributes; +export default function Edit( { attributes, clientId, setAttributes } ) { + const { layout, logo, position, color, flexColor, flexRatio, id } = attributes; const isFlex = layout === 'flex'; const [loaded, setLoaded] = useState(false); @@ -22,6 +22,13 @@ export default function Edit( { attributes, setAttributes } ) { color, }, }; + + useEffect(() => { + if (!id) { + setAttributes({id: 'ppcp-' + clientId}); + } + }, []); + return ( <> diff --git a/modules/ppcp-paylater-block/resources/js/save.js b/modules/ppcp-paylater-block/resources/js/save.js index e1db30d8f..9750d6797 100644 --- a/modules/ppcp-paylater-block/resources/js/save.js +++ b/modules/ppcp-paylater-block/resources/js/save.js @@ -1,8 +1,8 @@ import { useBlockProps } from '@wordpress/block-editor'; export default function save( { attributes } ) { - const { layout, logo, position, color, flexColor, flexRatio } = attributes; - const dataAttributes = layout === 'flex' ? { + const { layout, logo, position, color, flexColor, flexRatio, id } = attributes; + const paypalAttributes = layout === 'flex' ? { 'data-pp-style-layout': 'flex', 'data-pp-style-color': flexColor, 'data-pp-style-ratio': flexRatio, @@ -14,7 +14,8 @@ export default function save( { attributes } ) { }; const props = { className: 'ppcp-paylater-message-block', - ...dataAttributes, + id, + ...paypalAttributes, }; return
; From 2f1c8f6c572e69cac45f4480203b6e7a930e782f Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 6 Dec 2023 17:33:13 +0200 Subject: [PATCH 05/39] Hide logo position when not available --- modules/ppcp-paylater-block/resources/js/edit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-paylater-block/resources/js/edit.js b/modules/ppcp-paylater-block/resources/js/edit.js index ef38cb8cf..c9a879b37 100644 --- a/modules/ppcp-paylater-block/resources/js/edit.js +++ b/modules/ppcp-paylater-block/resources/js/edit.js @@ -53,7 +53,7 @@ export default function Edit( { attributes, clientId, setAttributes } ) { value={logo} onChange={(value) => setAttributes({logo: value})} />)} - { !isFlex && ( Date: Wed, 6 Dec 2023 17:45:43 +0200 Subject: [PATCH 06/39] Add icon --- .../resources/js/paylater-block.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/ppcp-paylater-block/resources/js/paylater-block.js b/modules/ppcp-paylater-block/resources/js/paylater-block.js index 40692d3cc..b4dd86090 100644 --- a/modules/ppcp-paylater-block/resources/js/paylater-block.js +++ b/modules/ppcp-paylater-block/resources/js/paylater-block.js @@ -3,7 +3,18 @@ import { registerBlockType } from '@wordpress/blocks'; import Edit from './edit'; import save from './save'; +const paypalIcon = ( + + + + + + + +) + registerBlockType( 'woocommerce-paypal-payments/paylater-messages', { + icon: paypalIcon, edit: Edit, save, } ); From ee1e6538dc09ed63e218121bb3e4a02f0cc5fa5f Mon Sep 17 00:00:00 2001 From: Alex P Date: Thu, 7 Dec 2023 08:15:05 +0200 Subject: [PATCH 07/39] Set placement --- .../ContextBootstrap/MessagesBootstap.js | 6 +++++- modules/ppcp-paylater-block/block.json | 4 ++++ .../ppcp-paylater-block/resources/js/edit.js | 17 ++++++++++++++++- .../ppcp-paylater-block/resources/js/save.js | 5 ++++- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js b/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js index be593e615..bd11dfd81 100644 --- a/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js +++ b/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js @@ -10,7 +10,11 @@ class MessagesBootstrap { init() { Array.from(document.querySelectorAll('.ppcp-paylater-message-block')).forEach(blockElement => { - this.renderers.push(new MessageRenderer({wrapper: '#' + blockElement.id})); + const config = {wrapper: '#' + blockElement.id}; + if (!blockElement.getAttribute('data-pp-placement')) { + config.placement = this.gateway.messages.placement; + } + this.renderers.push(new MessageRenderer(config)); }); jQuery(document.body).on('ppcp_cart_rendered ppcp_checkout_rendered', () => { diff --git a/modules/ppcp-paylater-block/block.json b/modules/ppcp-paylater-block/block.json index 0c3d1b206..84e44ec45 100644 --- a/modules/ppcp-paylater-block/block.json +++ b/modules/ppcp-paylater-block/block.json @@ -34,6 +34,10 @@ "flexRatio": { "type": "string", "default": "8x1" + }, + "placement": { + "type": "string", + "default": "auto" } }, "supports": { diff --git a/modules/ppcp-paylater-block/resources/js/edit.js b/modules/ppcp-paylater-block/resources/js/edit.js index c9a879b37..5ddbf76cb 100644 --- a/modules/ppcp-paylater-block/resources/js/edit.js +++ b/modules/ppcp-paylater-block/resources/js/edit.js @@ -5,7 +5,7 @@ import { PanelBody, SelectControl, Spinner } from '@wordpress/components'; import { PayPalScriptProvider, PayPalMessages } from "@paypal/react-paypal-js"; export default function Edit( { attributes, clientId, setAttributes } ) { - const { layout, logo, position, color, flexColor, flexRatio, id } = attributes; + const { layout, logo, position, color, flexColor, flexRatio, placement, id } = attributes; const isFlex = layout === 'flex'; const [loaded, setLoaded] = useState(false); @@ -99,6 +99,21 @@ export default function Edit( { attributes, clientId, setAttributes } ) { value={flexRatio} onChange={(value) => setAttributes({flexRatio: value})} />)} + setAttributes( { placement: value } ) } + />
diff --git a/modules/ppcp-paylater-block/resources/js/save.js b/modules/ppcp-paylater-block/resources/js/save.js index 9750d6797..0e221d29c 100644 --- a/modules/ppcp-paylater-block/resources/js/save.js +++ b/modules/ppcp-paylater-block/resources/js/save.js @@ -1,7 +1,7 @@ import { useBlockProps } from '@wordpress/block-editor'; export default function save( { attributes } ) { - const { layout, logo, position, color, flexColor, flexRatio, id } = attributes; + const { layout, logo, position, color, flexColor, flexRatio, placement, id } = attributes; const paypalAttributes = layout === 'flex' ? { 'data-pp-style-layout': 'flex', 'data-pp-style-color': flexColor, @@ -12,6 +12,9 @@ export default function save( { attributes } ) { 'data-pp-style-logo-position': position, 'data-pp-style-text-color': color, }; + if (placement && placement !== 'auto') { + paypalAttributes['data-pp-placement'] = placement; + } const props = { className: 'ppcp-paylater-message-block', id, From 2ecbf089f5f9908cc04a138c0ea26d4451b89a7a Mon Sep 17 00:00:00 2001 From: Alex P Date: Thu, 7 Dec 2023 10:18:57 +0200 Subject: [PATCH 08/39] Update block description --- modules/ppcp-paylater-block/block.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/ppcp-paylater-block/block.json b/modules/ppcp-paylater-block/block.json index 84e44ec45..3a174c38f 100644 --- a/modules/ppcp-paylater-block/block.json +++ b/modules/ppcp-paylater-block/block.json @@ -2,10 +2,9 @@ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "woocommerce-paypal-payments/paylater-messages", - "version": "1.0.0", "title": "PayPal Pay Later messages", - "category": "widgets", - "description": "Pay Later", + "category": "woocommerce", + "description": "PayPal Pay Later messaging will be displayed for eligible customers. Customers automatically see the most relevant Pay Later offering.", "example": {}, "attributes": { "id": { From 7e8881dc9df3cacdb768b79641e587c04f31a5ec Mon Sep 17 00:00:00 2001 From: Alex P Date: Thu, 7 Dec 2023 16:28:30 +0200 Subject: [PATCH 09/39] Retrieve current script url params (client id, ...) in editor --- modules/ppcp-paylater-block/block.json | 2 +- .../ppcp-paylater-block/resources/js/edit.js | 25 +++++++++++++++---- .../resources/js/hooks/script-params.js | 24 ++++++++++++++++++ modules/ppcp-paylater-block/services.php | 14 ++++++++++- .../src/PayLaterBlockModule.php | 23 ++++++++++++++++- 5 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 modules/ppcp-paylater-block/resources/js/hooks/script-params.js diff --git a/modules/ppcp-paylater-block/block.json b/modules/ppcp-paylater-block/block.json index 3a174c38f..4b4c75efe 100644 --- a/modules/ppcp-paylater-block/block.json +++ b/modules/ppcp-paylater-block/block.json @@ -43,6 +43,6 @@ "html": false }, "textdomain": "woocommerce-paypal-payments", - "editorScript": "file:./assets/js/paylater-block.js", + "editorScript": "ppcp-paylater-block", "editorStyle": "file:./assets/css/edit.css" } diff --git a/modules/ppcp-paylater-block/resources/js/edit.js b/modules/ppcp-paylater-block/resources/js/edit.js index 5ddbf76cb..573b770d9 100644 --- a/modules/ppcp-paylater-block/resources/js/edit.js +++ b/modules/ppcp-paylater-block/resources/js/edit.js @@ -3,6 +3,7 @@ import { useState, useEffect } from '@wordpress/element'; import { InspectorControls, useBlockProps } from '@wordpress/block-editor'; import { PanelBody, SelectControl, Spinner } from '@wordpress/components'; import { PayPalScriptProvider, PayPalMessages } from "@paypal/react-paypal-js"; +import { useScriptParams } from "./hooks/script-params"; export default function Edit( { attributes, clientId, setAttributes } ) { const { layout, logo, position, color, flexColor, flexRatio, placement, id } = attributes; @@ -23,12 +24,29 @@ export default function Edit( { attributes, clientId, setAttributes } ) { }, }; + const props = useBlockProps({className: ['ppcp-paylater-block-preview', 'ppcp-overlay-parent']}); + useEffect(() => { if (!id) { setAttributes({id: 'ppcp-' + clientId}); } }, []); + const scriptParams = useScriptParams(PcpPayLaterBlock.ajax.cart_script_params); + if (scriptParams === null) { + return (
) + } + + const urlParams = scriptParams === false ? { + clientId: 'test', + components: 'messages', + } : { + ...scriptParams.url_params, + ...{ + components: 'messages', + } + } + return ( <> @@ -116,13 +134,10 @@ export default function Edit( { attributes, clientId, setAttributes } ) { /> -
+
{ + const [data, setData] = useState(null); + + useEffect(() => { + (async () => { + try { + const response = await fetch(requestConfig.endpoint); + const json = await response.json(); + if (json.success && json?.data?.url_params) { + setData(json.data); + } else { + setData(false); + } + } catch (e) { + console.error(e); + setData(false); + } + })(); + }, [requestConfig]); + + return data; +}; diff --git a/modules/ppcp-paylater-block/services.php b/modules/ppcp-paylater-block/services.php index 414e9b8da..24b1f0443 100644 --- a/modules/ppcp-paylater-block/services.php +++ b/modules/ppcp-paylater-block/services.php @@ -11,4 +11,16 @@ namespace WooCommerce\PayPalCommerce\PayLaterBlock; use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface; -return array(); +return array( + 'paylater-block.url' => static function ( ContainerInterface $container ): string { + /** + * Cannot return false for this path. + * + * @psalm-suppress PossiblyFalseArgument + */ + return plugins_url( + '/modules/ppcp-paylater-block/', + dirname( realpath( __FILE__ ), 3 ) . '/woocommerce-paypal-payments.php' + ); + }, +); diff --git a/modules/ppcp-paylater-block/src/PayLaterBlockModule.php b/modules/ppcp-paylater-block/src/PayLaterBlockModule.php index 25d9050ac..d7eb2b1d0 100644 --- a/modules/ppcp-paylater-block/src/PayLaterBlockModule.php +++ b/modules/ppcp-paylater-block/src/PayLaterBlockModule.php @@ -9,6 +9,7 @@ declare(strict_types=1); namespace WooCommerce\PayPalCommerce\PayLaterBlock; +use WooCommerce\PayPalCommerce\Button\Endpoint\CartScriptParamsEndpoint; use WooCommerce\PayPalCommerce\Vendor\Dhii\Container\ServiceProvider; use WooCommerce\PayPalCommerce\Vendor\Dhii\Modular\Module\ModuleInterface; use WooCommerce\PayPalCommerce\Vendor\Interop\Container\ServiceProviderInterface; @@ -34,7 +35,27 @@ class PayLaterBlockModule implements ModuleInterface { public function run( ContainerInterface $c ): void { add_action( 'init', - function (): void { + function () use ( $c ): void { + $script_handle = 'ppcp-paylater-block'; + wp_register_script( + $script_handle, + $c->get( 'paylater-block.url' ) . '/assets/js/paylater-block.js', + array(), + $c->get( 'ppcp.asset-version' ), + true + ); + wp_localize_script( + $script_handle, + 'PcpPayLaterBlock', + array( + 'ajax' => array( + 'cart_script_params' => array( + 'endpoint' => \WC_AJAX::get_endpoint( CartScriptParamsEndpoint::ENDPOINT ), + ), + ), + ) + ); + /** * Cannot return false for this path. * From ab0fcadb067ab2f978e495ace0b6a861fced0d0d Mon Sep 17 00:00:00 2001 From: Alex P Date: Fri, 8 Dec 2023 09:33:02 +0200 Subject: [PATCH 10/39] Fix block name --- modules/ppcp-paylater-block/block.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-paylater-block/block.json b/modules/ppcp-paylater-block/block.json index 4b4c75efe..ff8a5476e 100644 --- a/modules/ppcp-paylater-block/block.json +++ b/modules/ppcp-paylater-block/block.json @@ -2,7 +2,7 @@ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "woocommerce-paypal-payments/paylater-messages", - "title": "PayPal Pay Later messages", + "title": "PayPal Pay Later messaging", "category": "woocommerce", "description": "PayPal Pay Later messaging will be displayed for eligible customers. Customers automatically see the most relevant Pay Later offering.", "example": {}, From 2985687b4ec6dfc855cb8ba7bb10ca1617add8f8 Mon Sep 17 00:00:00 2001 From: Alex P Date: Fri, 8 Dec 2023 15:01:14 +0200 Subject: [PATCH 11/39] Fix block errors when not onboarded --- modules/ppcp-blocks/src/PayPalPaymentMethod.php | 2 +- .../src/Endpoint/CartScriptParamsEndpoint.php | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/modules/ppcp-blocks/src/PayPalPaymentMethod.php b/modules/ppcp-blocks/src/PayPalPaymentMethod.php index 1f43d26a1..46ad71bb1 100644 --- a/modules/ppcp-blocks/src/PayPalPaymentMethod.php +++ b/modules/ppcp-blocks/src/PayPalPaymentMethod.php @@ -236,7 +236,7 @@ class PayPalPaymentMethod extends AbstractPaymentMethodType { 'id' => $this->gateway->id, 'title' => $this->gateway->title, 'description' => $this->gateway->description, - 'enabled' => $this->settings_status->is_smart_button_enabled_for_location( $script_data['context'] ), + 'enabled' => $this->settings_status->is_smart_button_enabled_for_location( $script_data['context'] ?? 'checkout' ), 'fundingSource' => $this->session_handler->funding_source(), 'finalReviewEnabled' => $this->final_review_enabled, 'addPlaceOrderMethod' => $this->add_place_order_method, diff --git a/modules/ppcp-button/src/Endpoint/CartScriptParamsEndpoint.php b/modules/ppcp-button/src/Endpoint/CartScriptParamsEndpoint.php index 316d2c000..e93590e7b 100644 --- a/modules/ppcp-button/src/Endpoint/CartScriptParamsEndpoint.php +++ b/modules/ppcp-button/src/Endpoint/CartScriptParamsEndpoint.php @@ -12,7 +12,7 @@ namespace WooCommerce\PayPalCommerce\Button\Endpoint; use Psr\Log\LoggerInterface; use Throwable; use WooCommerce\PayPalCommerce\ApiClient\Entity\Money; -use WooCommerce\PayPalCommerce\Button\Assets\SmartButton; +use WooCommerce\PayPalCommerce\Button\Assets\SmartButtonInterface; /** * Class CartScriptParamsEndpoint. @@ -25,7 +25,7 @@ class CartScriptParamsEndpoint implements EndpointInterface { /** * The SmartButton. * - * @var SmartButton + * @var SmartButtonInterface */ private $smart_button; @@ -39,11 +39,11 @@ class CartScriptParamsEndpoint implements EndpointInterface { /** * CartScriptParamsEndpoint constructor. * - * @param SmartButton $smart_button he SmartButton. - * @param LoggerInterface $logger The logger. + * @param SmartButtonInterface $smart_button he SmartButton. + * @param LoggerInterface $logger The logger. */ public function __construct( - SmartButton $smart_button, + SmartButtonInterface $smart_button, LoggerInterface $logger ) { $this->smart_button = $smart_button; @@ -73,6 +73,10 @@ class CartScriptParamsEndpoint implements EndpointInterface { $include_shipping = (bool) wc_clean( wp_unslash( $_GET['shipping'] ?? '' ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended $script_data = $this->smart_button->script_data(); + if ( ! $script_data ) { + wp_send_json_error(); + return false; + } $total = (float) WC()->cart->get_total( 'numeric' ); From a33d8dea3d23fd63dabb3bed2bd597c8e9cee554 Mon Sep 17 00:00:00 2001 From: Alex P Date: Fri, 8 Dec 2023 15:01:28 +0200 Subject: [PATCH 12/39] Fix react svg --- modules/ppcp-paylater-block/resources/js/paylater-block.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ppcp-paylater-block/resources/js/paylater-block.js b/modules/ppcp-paylater-block/resources/js/paylater-block.js index b4dd86090..27bcbebb1 100644 --- a/modules/ppcp-paylater-block/resources/js/paylater-block.js +++ b/modules/ppcp-paylater-block/resources/js/paylater-block.js @@ -6,9 +6,9 @@ import save from './save'; const paypalIcon = ( - - - + + + ) From 6d450d587fbb9917747cf6f970271df3247cd920 Mon Sep 17 00:00:00 2001 From: Alex P Date: Tue, 12 Dec 2023 10:52:33 +0200 Subject: [PATCH 13/39] Always include buttons and messages components when in editor --- modules/ppcp-button/src/Assets/SmartButton.php | 2 ++ modules/ppcp-button/src/Helper/ContextTrait.php | 15 +++++++++++++++ modules/ppcp-paylater-block/resources/js/edit.js | 2 +- .../ppcp-wc-gateway/src/Helper/SettingsStatus.php | 3 +++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index 63d43dc70..39bc183ee 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -636,6 +636,8 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages case 'shop': case 'home': return $messaging_enabled_for_current_location; + case 'block-editor': + return true; default: return false; } diff --git a/modules/ppcp-button/src/Helper/ContextTrait.php b/modules/ppcp-button/src/Helper/ContextTrait.php index e0fcb6d73..3a33cbdbb 100644 --- a/modules/ppcp-button/src/Helper/ContextTrait.php +++ b/modules/ppcp-button/src/Helper/ContextTrait.php @@ -98,6 +98,10 @@ trait ContextTrait { return 'add-payment-method'; } + if ( $this->is_block_editor() ) { + return 'block-editor'; + } + return 'mini-cart'; } @@ -174,4 +178,15 @@ trait ContextTrait { return $page_id && is_page( $page_id ) && isset( $wp->query_vars['add-payment-method'] ); } + + /** + * Checks if it is the block editor page. + */ + private function is_block_editor(): bool { + if ( ! function_exists( 'get_current_screen' ) ) { + return true; + } + $screen = get_current_screen(); + return $screen && $screen->is_block_editor(); + } } diff --git a/modules/ppcp-paylater-block/resources/js/edit.js b/modules/ppcp-paylater-block/resources/js/edit.js index 573b770d9..0ee25196f 100644 --- a/modules/ppcp-paylater-block/resources/js/edit.js +++ b/modules/ppcp-paylater-block/resources/js/edit.js @@ -43,7 +43,7 @@ export default function Edit( { attributes, clientId, setAttributes } ) { } : { ...scriptParams.url_params, ...{ - components: 'messages', + components: 'messages,buttons,funding-eligibility', } } diff --git a/modules/ppcp-wc-gateway/src/Helper/SettingsStatus.php b/modules/ppcp-wc-gateway/src/Helper/SettingsStatus.php index d1f848d19..b29b3b86a 100644 --- a/modules/ppcp-wc-gateway/src/Helper/SettingsStatus.php +++ b/modules/ppcp-wc-gateway/src/Helper/SettingsStatus.php @@ -85,6 +85,9 @@ class SettingsStatus { * @return bool true if is enabled, otherwise false. */ public function is_smart_button_enabled_for_location( string $location ): bool { + if ( $location === 'block-editor' ) { + $location = 'checkout-block'; + } return $this->is_enabled_for_location( 'smart_button_locations', $location ); } From 4e34332c0bb476866106998dd097619c59692cf2 Mon Sep 17 00:00:00 2001 From: Alex P Date: Tue, 12 Dec 2023 10:55:54 +0200 Subject: [PATCH 14/39] Do not include APM buttons in editor canMakePayment is not called, so cannot hide if not available --- .../ppcp-blocks/src/PayPalPaymentMethod.php | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/modules/ppcp-blocks/src/PayPalPaymentMethod.php b/modules/ppcp-blocks/src/PayPalPaymentMethod.php index 46ad71bb1..8d9f88540 100644 --- a/modules/ppcp-blocks/src/PayPalPaymentMethod.php +++ b/modules/ppcp-blocks/src/PayPalPaymentMethod.php @@ -224,13 +224,16 @@ class PayPalPaymentMethod extends AbstractPaymentMethodType { } } - $disabled_funding_sources = explode( ',', $script_data['url_params']['disable-funding'] ?? '' ) ?: array(); - $funding_sources = array_values( - array_diff( - array_keys( $this->all_funding_sources ), - $disabled_funding_sources - ) - ); + $funding_sources = array(); + if ( ! $this->is_editing() ) { + $disabled_funding_sources = explode( ',', $script_data['url_params']['disable-funding'] ?? '' ) ?: array(); + $funding_sources = array_values( + array_diff( + array_keys( $this->all_funding_sources ), + $disabled_funding_sources + ) + ); + } return array( 'id' => $this->gateway->id, @@ -253,4 +256,15 @@ class PayPalPaymentMethod extends AbstractPaymentMethodType { 'scriptData' => $script_data, ); } + + /** + * Checks if it is the block editing mode. + */ + private function is_editing(): bool { + if ( ! function_exists( 'get_current_screen' ) ) { + return true; + } + $screen = get_current_screen(); + return $screen && $screen->is_block_editor(); + } } From 5ab6d3b27d698719c9326663aa46fdd40fa3ba58 Mon Sep 17 00:00:00 2001 From: Alex P Date: Tue, 12 Dec 2023 10:57:31 +0200 Subject: [PATCH 15/39] Do not fail script loading if no script_attributes or data_client_id --- .../resources/js/modules/Helper/ScriptLoading.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/ppcp-button/resources/js/modules/Helper/ScriptLoading.js b/modules/ppcp-button/resources/js/modules/Helper/ScriptLoading.js index 6c7dc1a37..96070b5fb 100644 --- a/modules/ppcp-button/resources/js/modules/Helper/ScriptLoading.js +++ b/modules/ppcp-button/resources/js/modules/Helper/ScriptLoading.js @@ -56,10 +56,12 @@ export const loadPaypalScript = (config, onLoaded, onError = null) => { // Build the PayPal script options. let scriptOptions = keysToCamelCase(config.url_params); - scriptOptions = merge(scriptOptions, config.script_attributes); + if (config.script_attributes) { + scriptOptions = merge(scriptOptions, config.script_attributes); + } // Load PayPal script for special case with data-client-token - if (config.data_client_id.set_attribute) { + if (config.data_client_id?.set_attribute) { dataClientIdAttributeHandler(scriptOptions, config.data_client_id, callback, errorCallback); return; } From a99fbc6eb378c18d27321715367041c775c9674d Mon Sep 17 00:00:00 2001 From: Alex P Date: Tue, 12 Dec 2023 10:58:44 +0200 Subject: [PATCH 16/39] Do not load paypal script on checkout block methods registration --- .../resources/js/checkout-block.js | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/modules/ppcp-blocks/resources/js/checkout-block.js b/modules/ppcp-blocks/resources/js/checkout-block.js index c93f3094e..5b123e5fa 100644 --- a/modules/ppcp-blocks/resources/js/checkout-block.js +++ b/modules/ppcp-blocks/resources/js/checkout-block.js @@ -15,6 +15,8 @@ window.ppcpFundingSource = config.fundingSource; let registeredContext = false; +let paypalScriptPromise = null; + const PayPalComponent = ({ onClick, onClose, @@ -32,6 +34,15 @@ const PayPalComponent = ({ const [paypalOrder, setPaypalOrder] = useState(null); + const [paypalScriptLoaded, setPaypalScriptLoaded] = useState(false); + + if (!paypalScriptLoaded) { + if (!paypalScriptPromise) { + paypalScriptPromise = loadPaypalScriptPromise(config.scriptData) + } + paypalScriptPromise.then(() => setPaypalScriptLoaded(true)); + } + const methodId = fundingSource ? `${config.id}-${fundingSource}` : config.id; useEffect(() => { @@ -307,7 +318,11 @@ const PayPalComponent = ({ const style = normalizeStyleForFundingSource(config.scriptData.button.style, fundingSource); - const PayPalButton = window.paypal.Buttons.driver("react", { React, ReactDOM }); + if (!paypalScriptLoaded) { + return null; + } + + const PayPalButton = paypal.Buttons.driver("react", { React, ReactDOM }); return ( , ariaLabel: config.title, canMakePayment: async () => { + if (!paypalScriptPromise) { + paypalScriptPromise = loadPaypalScriptPromise(config.scriptData) + } await paypalScriptPromise; return paypal.Buttons({fundingSource}).isEligible(); From 93997fac7e6dc61315f615a9e1e60fbdfadf5fba Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 13 Dec 2023 08:34:07 +0200 Subject: [PATCH 17/39] Fix messages check in editor --- modules/ppcp-button/src/Assets/SmartButton.php | 7 +++---- modules/ppcp-button/src/Helper/ContextTrait.php | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index 39bc183ee..e06f34a8e 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -620,10 +620,6 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages return false; } - if ( has_block( 'woocommerce-paypal-payments/paylater-messages' ) ) { - return true; - } - $location = $this->location(); $messaging_enabled_for_current_location = $this->settings_status->is_pay_later_messaging_enabled_for_location( $location ); @@ -638,6 +634,9 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages return $messaging_enabled_for_current_location; case 'block-editor': return true; + case 'checkout-block': + case 'cart-block': + return has_block( 'woocommerce-paypal-payments/paylater-messages' ) || $this->is_block_editor(); default: return false; } diff --git a/modules/ppcp-button/src/Helper/ContextTrait.php b/modules/ppcp-button/src/Helper/ContextTrait.php index 3a33cbdbb..a9c81c08d 100644 --- a/modules/ppcp-button/src/Helper/ContextTrait.php +++ b/modules/ppcp-button/src/Helper/ContextTrait.php @@ -182,7 +182,7 @@ trait ContextTrait { /** * Checks if it is the block editor page. */ - private function is_block_editor(): bool { + protected function is_block_editor(): bool { if ( ! function_exists( 'get_current_screen' ) ) { return true; } From 910c6ccb6d7aeb3c92808b09277c776b4c5fb9b7 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 13 Dec 2023 08:47:21 +0200 Subject: [PATCH 18/39] Do not use react-paypal-js --- modules/ppcp-paylater-block/package.json | 1 - .../resources/js/components/PayPalMessages.js | 29 ++++++++++ .../ppcp-paylater-block/resources/js/edit.js | 53 +++++++++++-------- modules/ppcp-paylater-block/yarn.lock | 32 ----------- 4 files changed, 60 insertions(+), 55 deletions(-) create mode 100644 modules/ppcp-paylater-block/resources/js/components/PayPalMessages.js diff --git a/modules/ppcp-paylater-block/package.json b/modules/ppcp-paylater-block/package.json index 711ad6549..c88508afe 100644 --- a/modules/ppcp-paylater-block/package.json +++ b/modules/ppcp-paylater-block/package.json @@ -10,7 +10,6 @@ "Edge >= 14" ], "dependencies": { - "@paypal/react-paypal-js": "^8.1.3", "core-js": "^3.25.0" }, "devDependencies": { diff --git a/modules/ppcp-paylater-block/resources/js/components/PayPalMessages.js b/modules/ppcp-paylater-block/resources/js/components/PayPalMessages.js new file mode 100644 index 000000000..d2115f100 --- /dev/null +++ b/modules/ppcp-paylater-block/resources/js/components/PayPalMessages.js @@ -0,0 +1,29 @@ +import { useRef, useEffect } from '@wordpress/element'; + +export default function PayPalMessages({ + amount, + style, + onRender, +}) { + const containerRef = useRef(null); + + useEffect(() => { + const messages = paypal.Messages({ + amount, + style, + onRender, + }); + + messages.render(containerRef.current) + .catch(err => { + // Ignore when component destroyed. + if (!containerRef.current || containerRef.current.children.length === 0) { + return; + } + + console.error(err); + }); + }, [amount, style, onRender]); + + return
+} diff --git a/modules/ppcp-paylater-block/resources/js/edit.js b/modules/ppcp-paylater-block/resources/js/edit.js index 0ee25196f..6696506e6 100644 --- a/modules/ppcp-paylater-block/resources/js/edit.js +++ b/modules/ppcp-paylater-block/resources/js/edit.js @@ -2,14 +2,17 @@ import { __ } from '@wordpress/i18n'; import { useState, useEffect } from '@wordpress/element'; import { InspectorControls, useBlockProps } from '@wordpress/block-editor'; import { PanelBody, SelectControl, Spinner } from '@wordpress/components'; -import { PayPalScriptProvider, PayPalMessages } from "@paypal/react-paypal-js"; import { useScriptParams } from "./hooks/script-params"; +import { loadPaypalScript } from '../../../ppcp-button/resources/js/modules/Helper/ScriptLoading' +import PayPalMessages from "./components/PayPalMessages"; export default function Edit( { attributes, clientId, setAttributes } ) { const { layout, logo, position, color, flexColor, flexRatio, placement, id } = attributes; const isFlex = layout === 'flex'; - const [loaded, setLoaded] = useState(false); + const [paypalScriptState, setPaypalScriptState] = useState(null); + + const [rendered, setRendered] = useState(false); const previewStyle = { layout, @@ -26,25 +29,36 @@ export default function Edit( { attributes, clientId, setAttributes } ) { const props = useBlockProps({className: ['ppcp-paylater-block-preview', 'ppcp-overlay-parent']}); + const loadingElement =
; + useEffect(() => { if (!id) { setAttributes({id: 'ppcp-' + clientId}); } }, []); - const scriptParams = useScriptParams(PcpPayLaterBlock.ajax.cart_script_params); + let scriptParams = useScriptParams(PcpPayLaterBlock.ajax.cart_script_params); if (scriptParams === null) { - return (
) + return loadingElement; + } + if (scriptParams === false) { + scriptParams = { + url_params: { + clientId: 'test', + components: 'messages,buttons,funding-eligibility', + } + } } - const urlParams = scriptParams === false ? { - clientId: 'test', - components: 'messages', - } : { - ...scriptParams.url_params, - ...{ - components: 'messages,buttons,funding-eligibility', - } + if (!paypalScriptState) { + loadPaypalScript(scriptParams, () => { + setPaypalScriptState('loaded') + }, () => { + setPaypalScriptState('failed') + }); + } + if (paypalScriptState !== 'loaded') { + return loadingElement; } return ( @@ -136,18 +150,13 @@ export default function Edit( { attributes, clientId, setAttributes } ) {
- - setLoaded(true)} - /> - + setRendered(true)} + />
{/* make the message not clickable */} - {!loaded && ()} + {!rendered && ()}
diff --git a/modules/ppcp-paylater-block/yarn.lock b/modules/ppcp-paylater-block/yarn.lock index d6b9c3600..209adc4a4 100644 --- a/modules/ppcp-paylater-block/yarn.lock +++ b/modules/ppcp-paylater-block/yarn.lock @@ -1005,28 +1005,6 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@paypal/paypal-js@^7.0.0": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@paypal/paypal-js/-/paypal-js-7.1.1.tgz#3547cbb96f1692209c4b33cf0f8e69225c2e84a3" - integrity sha512-fVpExBrHINGHsyODYKBXSMinxrgPKzmVW7ZCaCqUaMl7kTSR1ZsVi2IhgLvsPpXF4LWSAMkPTP/J6aetQ6ZlNA== - dependencies: - promise-polyfill "^8.3.0" - -"@paypal/react-paypal-js@^8.1.3": - version "8.1.3" - resolved "https://registry.yarnpkg.com/@paypal/react-paypal-js/-/react-paypal-js-8.1.3.tgz#2a46bd864eee02efada370ca50fab5a5bf38f4ff" - integrity sha512-hEm27iYP/UHS3XPBhDdiK2U4PH1FxrOD5O3f9tstAVLJd82l/laCjq751HiESSm63PVOoFeKE41Fe1mYGab+oA== - dependencies: - "@paypal/paypal-js" "^7.0.0" - "@paypal/sdk-constants" "^1.0.122" - -"@paypal/sdk-constants@^1.0.122": - version "1.0.133" - resolved "https://registry.yarnpkg.com/@paypal/sdk-constants/-/sdk-constants-1.0.133.tgz#ee65c0bb574554becc8a5d3d0a834a944bbeb0e7" - integrity sha512-NWV0IWrHwQQrNLaUYxQ1GsytvHbDu+x63kRpNJfw1OQeDcUca4B0I4LoBktWQl5gICi090hD56n2Wg08dAl44g== - dependencies: - hi-base32 "^0.5.0" - "@types/eslint-scope@^3.7.3": version "3.7.4" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" @@ -1621,11 +1599,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hi-base32@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e" - integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== - immutable@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" @@ -1867,11 +1840,6 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -promise-polyfill@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.3.0.tgz#9284810268138d103807b11f4e23d5e945a4db63" - integrity sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg== - punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" From ccc0e263dde31d25786e5248c61eb6133f8480a1 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 13 Dec 2023 17:37:13 +0200 Subject: [PATCH 19/39] Allow to add paylater block inside block cart/checkout --- .../resources/js/paylater-block.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/modules/ppcp-paylater-block/resources/js/paylater-block.js b/modules/ppcp-paylater-block/resources/js/paylater-block.js index 27bcbebb1..605f20981 100644 --- a/modules/ppcp-paylater-block/resources/js/paylater-block.js +++ b/modules/ppcp-paylater-block/resources/js/paylater-block.js @@ -1,4 +1,5 @@ import { registerBlockType } from '@wordpress/blocks'; +import { registerCheckoutFilters } from '@woocommerce/blocks-checkout'; import Edit from './edit'; import save from './save'; @@ -13,8 +14,22 @@ const paypalIcon = ( ) -registerBlockType( 'woocommerce-paypal-payments/paylater-messages', { +const blockId = 'woocommerce-paypal-payments/paylater-messages'; + +registerBlockType( blockId, { icon: paypalIcon, edit: Edit, save, } ); + +document.addEventListener( 'DOMContentLoaded', () => { + // allow to add this block inside WC cart/checkout blocks + registerCheckoutFilters( blockId, { + additionalCartCheckoutInnerBlockTypes: ( + defaultValue + ) => { + defaultValue.push( blockId ); + return defaultValue; + }, + } ); +} ); From c8632e382629086459e607f03c9dcdc448348539 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 13 Dec 2023 21:42:23 +0200 Subject: [PATCH 20/39] Update paylater amount in block cart/checkout --- .../BlockCheckoutMessagesBootstrap.js | 55 +++++++++++++++++++ .../resources/js/Helper/debounce.js | 9 +++ .../resources/js/checkout-block.js | 8 ++- .../ContextBootstrap/MessagesBootstap.js | 7 ++- 4 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 modules/ppcp-blocks/resources/js/Bootstrap/BlockCheckoutMessagesBootstrap.js create mode 100644 modules/ppcp-blocks/resources/js/Helper/debounce.js diff --git a/modules/ppcp-blocks/resources/js/Bootstrap/BlockCheckoutMessagesBootstrap.js b/modules/ppcp-blocks/resources/js/Bootstrap/BlockCheckoutMessagesBootstrap.js new file mode 100644 index 000000000..6d301451d --- /dev/null +++ b/modules/ppcp-blocks/resources/js/Bootstrap/BlockCheckoutMessagesBootstrap.js @@ -0,0 +1,55 @@ +import MessagesBootstrap from "../../../../ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap"; +import {debounce} from "../Helper/debounce"; + +class BlockCheckoutMessagesBootstrap { + constructor(scriptData) { + this.messagesBootstrap = new MessagesBootstrap(scriptData, null); + this.lastCartTotal = null; + } + + init() { + this.messagesBootstrap.init(); + + this._updateCartTotal(); + + if (wp.data?.subscribe) { + wp.data.subscribe(debounce(() => { + this._updateCartTotal(); + }, 300)); + } + } + + /** + * @private + */ + _getCartTotal() { + if (!wp.data.select) { + return null; + } + + const cart = wp.data.select('wc/store/cart') + if (!cart) { + return null; + } + + const totals = cart.getCartTotals(); + return parseInt(totals.total_price, 10) / 10 ** totals.currency_minor_unit; + } + + /** + * @private + */ + _updateCartTotal() { + const currentTotal = this._getCartTotal(); + if (currentTotal === null) { + return; + } + + if (currentTotal !== this.lastCartTotal) { + this.lastCartTotal = currentTotal; + jQuery(document.body).trigger('ppcp_block_cart_total_updated', [currentTotal]); + } + } +} + +export default BlockCheckoutMessagesBootstrap; diff --git a/modules/ppcp-blocks/resources/js/Helper/debounce.js b/modules/ppcp-blocks/resources/js/Helper/debounce.js new file mode 100644 index 000000000..68a34e771 --- /dev/null +++ b/modules/ppcp-blocks/resources/js/Helper/debounce.js @@ -0,0 +1,9 @@ +export const debounce = (callback, delayMs) => { + let timeoutId = null; + return (...args) => { + window.clearTimeout(timeoutId); + timeoutId = window.setTimeout(() => { + callback.apply(null, args); + }, delayMs); + }; +}; diff --git a/modules/ppcp-blocks/resources/js/checkout-block.js b/modules/ppcp-blocks/resources/js/checkout-block.js index 5b123e5fa..edc3cb938 100644 --- a/modules/ppcp-blocks/resources/js/checkout-block.js +++ b/modules/ppcp-blocks/resources/js/checkout-block.js @@ -8,6 +8,7 @@ import { normalizeStyleForFundingSource } from '../../../ppcp-button/resources/js/modules/Helper/Style' import buttonModuleWatcher from "../../../ppcp-button/resources/js/modules/ButtonModuleWatcher"; +import BlockCheckoutMessagesBootstrap from "./Bootstrap/BlockCheckoutMessagesBootstrap"; const config = wc.wcSettings.getSetting('ppcp-gateway_data'); @@ -38,6 +39,7 @@ const PayPalComponent = ({ if (!paypalScriptLoaded) { if (!paypalScriptPromise) { + // for editor, since canMakePayment was not called paypalScriptPromise = loadPaypalScriptPromise(config.scriptData) } paypalScriptPromise.then(() => setPaypalScriptLoaded(true)); @@ -386,7 +388,11 @@ if (config.scriptData.continuation) { ariaLabel: config.title, canMakePayment: async () => { if (!paypalScriptPromise) { - paypalScriptPromise = loadPaypalScriptPromise(config.scriptData) + paypalScriptPromise = loadPaypalScriptPromise(config.scriptData); + paypalScriptPromise.then(() => { + const messagesBootstrap = new BlockCheckoutMessagesBootstrap(config.scriptData); + messagesBootstrap.init(); + }); } await paypalScriptPromise; diff --git a/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js b/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js index bd11dfd81..5000b5438 100644 --- a/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js +++ b/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js @@ -4,8 +4,11 @@ import MessageRenderer from "../Renderer/MessageRenderer"; class MessagesBootstrap { constructor(gateway, messageRenderer) { this.gateway = gateway; - this.renderers = [messageRenderer]; + this.renderers = []; this.lastAmount = this.gateway.messages.amount; + if (messageRenderer) { + this.renderers.push(messageRenderer); + } } init() { @@ -25,7 +28,7 @@ class MessagesBootstrap { this.render(); }); - jQuery(document.body).on('ppcp_cart_total_updated ppcp_checkout_total_updated ppcp_product_total_updated', (e, amount) => { + jQuery(document.body).on('ppcp_cart_total_updated ppcp_checkout_total_updated ppcp_product_total_updated ppcp_block_cart_total_updated', (e, amount) => { if (this.lastAmount !== amount) { this.lastAmount = amount; From 90d8fcc5307e96e129ad7af020733916684e3fb4 Mon Sep 17 00:00:00 2001 From: Alex P Date: Thu, 14 Dec 2023 10:36:15 +0200 Subject: [PATCH 21/39] Show paylater amount in editor if cart/checkout --- modules/ppcp-paylater-block/resources/js/edit.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/ppcp-paylater-block/resources/js/edit.js b/modules/ppcp-paylater-block/resources/js/edit.js index 6696506e6..684e4c32e 100644 --- a/modules/ppcp-paylater-block/resources/js/edit.js +++ b/modules/ppcp-paylater-block/resources/js/edit.js @@ -14,6 +14,12 @@ export default function Edit( { attributes, clientId, setAttributes } ) { const [rendered, setRendered] = useState(false); + let amount = undefined; + const postContent = String(wp.data.select('core/editor')?.getEditedPostContent()); + if (postContent.includes('woocommerce/checkout') || postContent.includes('woocommerce/cart')) { + amount = 50.0; + } + const previewStyle = { layout, logo: { @@ -152,6 +158,7 @@ export default function Edit( { attributes, clientId, setAttributes } ) {
setRendered(true)} />
From da0a17da6ad0325d6cc31f809d2a3749662cc5d5 Mon Sep 17 00:00:00 2001 From: Alex P Date: Thu, 14 Dec 2023 14:57:55 +0200 Subject: [PATCH 22/39] Fix wc import --- modules/ppcp-paylater-block/resources/js/paylater-block.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ppcp-paylater-block/resources/js/paylater-block.js b/modules/ppcp-paylater-block/resources/js/paylater-block.js index 605f20981..873147c9f 100644 --- a/modules/ppcp-paylater-block/resources/js/paylater-block.js +++ b/modules/ppcp-paylater-block/resources/js/paylater-block.js @@ -1,5 +1,4 @@ import { registerBlockType } from '@wordpress/blocks'; -import { registerCheckoutFilters } from '@woocommerce/blocks-checkout'; import Edit from './edit'; import save from './save'; @@ -23,6 +22,8 @@ registerBlockType( blockId, { } ); document.addEventListener( 'DOMContentLoaded', () => { + const { registerCheckoutFilters } = window.wc.blocksCheckout; + // allow to add this block inside WC cart/checkout blocks registerCheckoutFilters( blockId, { additionalCartCheckoutInnerBlockTypes: ( From 6dd3d47649587157c78051d9f42b188516e44d2b Mon Sep 17 00:00:00 2001 From: Alex P Date: Sat, 16 Dec 2023 13:49:40 +0200 Subject: [PATCH 23/39] Fix webpack config --- modules/ppcp-paylater-block/webpack.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-paylater-block/webpack.config.js b/modules/ppcp-paylater-block/webpack.config.js index 512da2177..78519f0a9 100644 --- a/modules/ppcp-paylater-block/webpack.config.js +++ b/modules/ppcp-paylater-block/webpack.config.js @@ -1,5 +1,5 @@ const path = require('path'); -const isProduction = process.env.NODE_ENV === 'production8'; +const isProduction = process.env.NODE_ENV === 'production'; const DependencyExtractionWebpackPlugin = require( '@woocommerce/dependency-extraction-webpack-plugin' ); From 7203cd01382c1d5a09ffef01240db7e0f95a895d Mon Sep 17 00:00:00 2001 From: Alex P Date: Mon, 18 Dec 2023 08:01:21 +0200 Subject: [PATCH 24/39] Always include messages component in editor ajax request determines context incorrectly --- modules/ppcp-paylater-block/resources/js/edit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-paylater-block/resources/js/edit.js b/modules/ppcp-paylater-block/resources/js/edit.js index 684e4c32e..c430bb501 100644 --- a/modules/ppcp-paylater-block/resources/js/edit.js +++ b/modules/ppcp-paylater-block/resources/js/edit.js @@ -51,10 +51,10 @@ export default function Edit( { attributes, clientId, setAttributes } ) { scriptParams = { url_params: { clientId: 'test', - components: 'messages,buttons,funding-eligibility', } } } + scriptParams.url_params.components = 'messages,buttons,funding-eligibility'; if (!paypalScriptState) { loadPaypalScript(scriptParams, () => { From 5c767e7bf6a7797490f9144f65d7f39611143840 Mon Sep 17 00:00:00 2001 From: Alex P Date: Mon, 18 Dec 2023 08:03:35 +0200 Subject: [PATCH 25/39] Register block later otherwise WC category is not registered yet --- modules/ppcp-paylater-block/src/PayLaterBlockModule.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ppcp-paylater-block/src/PayLaterBlockModule.php b/modules/ppcp-paylater-block/src/PayLaterBlockModule.php index d7eb2b1d0..bd447f0ec 100644 --- a/modules/ppcp-paylater-block/src/PayLaterBlockModule.php +++ b/modules/ppcp-paylater-block/src/PayLaterBlockModule.php @@ -62,7 +62,8 @@ class PayLaterBlockModule implements ModuleInterface { * @psalm-suppress PossiblyFalseArgument */ register_block_type( dirname( realpath( __FILE__ ), 2 ) ); - } + }, + 20 ); } From 0ccf143714d2d57418988e2ba4eccc2427f04a62 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 20 Dec 2023 08:28:39 +0200 Subject: [PATCH 26/39] Add filter for disabling paylater block --- modules.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules.php b/modules.php index 33a42406d..664cf5ae9 100644 --- a/modules.php +++ b/modules.php @@ -28,7 +28,6 @@ return function ( string $root_dir ): iterable { ( require "$modules_dir/ppcp-uninstall/module.php" )(), ( require "$modules_dir/ppcp-blocks/module.php" )(), ( require "$modules_dir/ppcp-paypal-subscriptions/module.php" )(), - ( require "$modules_dir/ppcp-paylater-block/module.php" )(), ); if ( apply_filters( // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores @@ -70,5 +69,12 @@ return function ( string $root_dir ): iterable { $modules[] = ( require "$modules_dir/ppcp-save-payment-methods/module.php" )(); } + if ( apply_filters( + 'woocommerce.feature-flags.woocommerce_paypal_payments.paylater_block_enabled', + getenv( 'PCP_PAYLATER_BLOCK' ) !== '0' + ) ) { + $modules[] = ( require "$modules_dir/ppcp-paylater-block/module.php" )(); + } + return $modules; }; From 31c90c149e92f9b5dc63d483458152fde427c5cd Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 20 Dec 2023 08:29:33 +0200 Subject: [PATCH 27/39] Fix phpcs:disable duplication --- modules.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules.php b/modules.php index 664cf5ae9..e65db663e 100644 --- a/modules.php +++ b/modules.php @@ -29,8 +29,9 @@ return function ( string $root_dir ): iterable { ( require "$modules_dir/ppcp-blocks/module.php" )(), ( require "$modules_dir/ppcp-paypal-subscriptions/module.php" )(), ); + // phpcs:disable WordPress.NamingConventions.ValidHookName.UseUnderscores + if ( apply_filters( - // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores 'woocommerce.feature-flags.woocommerce_paypal_payments.applepay_enabled', getenv( 'PCP_APPLEPAY_ENABLED' ) !== '0' ) ) { @@ -38,7 +39,6 @@ return function ( string $root_dir ): iterable { } if ( apply_filters( - //phpcs:disable WordPress.NamingConventions.ValidHookName.UseUnderscores 'woocommerce.feature-flags.woocommerce_paypal_payments.googlepay_enabled', getenv( 'PCP_GOOGLEPAY_ENABLED' ) !== '0' ) ) { @@ -46,7 +46,6 @@ return function ( string $root_dir ): iterable { } if ( apply_filters( - //phpcs:disable WordPress.NamingConventions.ValidHookName.UseUnderscores 'woocommerce.deprecated_flags.woocommerce_paypal_payments.saved_payment_checker_enabled', getenv( 'PCP_SAVED_PAYMENT_CHECKER_ENABLED' ) === '1' ) ) { @@ -54,7 +53,6 @@ return function ( string $root_dir ): iterable { } if ( apply_filters( - //phpcs:disable WordPress.NamingConventions.ValidHookName.UseUnderscores 'woocommerce.feature-flags.woocommerce_paypal_payments.card_fields_enabled', getenv( 'PCP_CARD_FIELDS_ENABLED' ) === '1' ) ) { @@ -62,7 +60,6 @@ return function ( string $root_dir ): iterable { } if ( apply_filters( - //phpcs:disable WordPress.NamingConventions.ValidHookName.UseUnderscores 'woocommerce.feature-flags.woocommerce_paypal_payments.save_payment_methods_enabled', getenv( 'PCP_SAVE_PAYMENT_METHODS' ) === '1' ) ) { From 16fbb5b4d1c34ccc8f96a7be39e0844c905bd750 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 20 Dec 2023 08:56:23 +0200 Subject: [PATCH 28/39] Extract module flag check --- modules.php | 6 ++---- .../ppcp-paylater-block/src/PayLaterBlockModule.php | 11 +++++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/modules.php b/modules.php index e65db663e..83257dd30 100644 --- a/modules.php +++ b/modules.php @@ -5,6 +5,7 @@ * @package WooCommerce\PayPalCommerce */ +use WooCommerce\PayPalCommerce\PayLaterBlock\PayLaterBlockModule; use WooCommerce\PayPalCommerce\PluginModule; return function ( string $root_dir ): iterable { @@ -66,10 +67,7 @@ return function ( string $root_dir ): iterable { $modules[] = ( require "$modules_dir/ppcp-save-payment-methods/module.php" )(); } - if ( apply_filters( - 'woocommerce.feature-flags.woocommerce_paypal_payments.paylater_block_enabled', - getenv( 'PCP_PAYLATER_BLOCK' ) !== '0' - ) ) { + if ( PayLaterBlockModule::is_enabled() ) { $modules[] = ( require "$modules_dir/ppcp-paylater-block/module.php" )(); } diff --git a/modules/ppcp-paylater-block/src/PayLaterBlockModule.php b/modules/ppcp-paylater-block/src/PayLaterBlockModule.php index bd447f0ec..22dba970d 100644 --- a/modules/ppcp-paylater-block/src/PayLaterBlockModule.php +++ b/modules/ppcp-paylater-block/src/PayLaterBlockModule.php @@ -19,6 +19,17 @@ use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface; * Class PayLaterBlockModule */ class PayLaterBlockModule implements ModuleInterface { + /** + * Returns whether the block should be loaded. + */ + public static function is_enabled(): bool { + return apply_filters( + // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + 'woocommerce.feature-flags.woocommerce_paypal_payments.paylater_block_enabled', + getenv( 'PCP_PAYLATER_BLOCK' ) !== '0' + ); + } + /** * {@inheritDoc} */ From 22e908ff25a426b2a1259f01e465f18844e1bb40 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 20 Dec 2023 08:59:47 +0200 Subject: [PATCH 29/39] Fix context check --- modules/ppcp-button/src/Assets/SmartButton.php | 6 ++++-- modules/ppcp-button/src/Helper/ContextTrait.php | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index e06f34a8e..311a39786 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -624,6 +624,8 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages $messaging_enabled_for_current_location = $this->settings_status->is_pay_later_messaging_enabled_for_location( $location ); + $has_paylater_block = has_block( 'woocommerce-paypal-payments/paylater-messages' ); + switch ( $location ) { case 'checkout': case 'cart': @@ -636,9 +638,9 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages return true; case 'checkout-block': case 'cart-block': - return has_block( 'woocommerce-paypal-payments/paylater-messages' ) || $this->is_block_editor(); + return $has_paylater_block || $this->is_block_editor(); default: - return false; + return $has_paylater_block; } } diff --git a/modules/ppcp-button/src/Helper/ContextTrait.php b/modules/ppcp-button/src/Helper/ContextTrait.php index a9c81c08d..3deacb613 100644 --- a/modules/ppcp-button/src/Helper/ContextTrait.php +++ b/modules/ppcp-button/src/Helper/ContextTrait.php @@ -184,7 +184,7 @@ trait ContextTrait { */ protected function is_block_editor(): bool { if ( ! function_exists( 'get_current_screen' ) ) { - return true; + return false; } $screen = get_current_screen(); return $screen && $screen->is_block_editor(); From 340704756b6f379928b3645a1b22a48ac2c53512 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 20 Dec 2023 09:00:16 +0200 Subject: [PATCH 30/39] Do not render paylater block if module disabled --- .../ContextBootstrap/MessagesBootstap.js | 21 ++++++++++++------- .../ppcp-button/src/Assets/SmartButton.php | 6 +++++- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js b/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js index 5000b5438..775170345 100644 --- a/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js +++ b/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js @@ -12,14 +12,9 @@ class MessagesBootstrap { } init() { - Array.from(document.querySelectorAll('.ppcp-paylater-message-block')).forEach(blockElement => { - const config = {wrapper: '#' + blockElement.id}; - if (!blockElement.getAttribute('data-pp-placement')) { - config.placement = this.gateway.messages.placement; - } - this.renderers.push(new MessageRenderer(config)); - }); - + if (this.gateway.messages.block.enabled) { + this.discoverBlocks(); + } jQuery(document.body).on('ppcp_cart_rendered ppcp_checkout_rendered', () => { this.render(); }); @@ -39,6 +34,16 @@ class MessagesBootstrap { this.render(); } + discoverBlocks() { + Array.from(document.querySelectorAll('.ppcp-paylater-message-block')).forEach(blockElement => { + const config = {wrapper: '#' + blockElement.id}; + if (!blockElement.getAttribute('data-pp-placement')) { + config.placement = this.gateway.messages.placement; + } + this.renderers.push(new MessageRenderer(config)); + }); + } + shouldShow(renderer) { if (this.gateway.messages.is_hidden === true) { return false; diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index 311a39786..3dc7e08ca 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -32,6 +32,7 @@ use WooCommerce\PayPalCommerce\Button\Endpoint\ValidateCheckoutEndpoint; use WooCommerce\PayPalCommerce\Button\Helper\ContextTrait; use WooCommerce\PayPalCommerce\Button\Helper\MessagesApply; use WooCommerce\PayPalCommerce\Onboarding\Environment; +use WooCommerce\PayPalCommerce\PayLaterBlock\PayLaterBlockModule; use WooCommerce\PayPalCommerce\Session\SessionHandler; use WooCommerce\PayPalCommerce\WcSubscriptions\FreeTrialHandlerTrait; use WooCommerce\PayPalCommerce\WcSubscriptions\Helper\SubscriptionHelper; @@ -624,7 +625,7 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages $messaging_enabled_for_current_location = $this->settings_status->is_pay_later_messaging_enabled_for_location( $location ); - $has_paylater_block = has_block( 'woocommerce-paypal-payments/paylater-messages' ); + $has_paylater_block = has_block( 'woocommerce-paypal-payments/paylater-messages' ) && PayLaterBlockModule::is_enabled(); switch ( $location ) { case 'checkout': @@ -868,6 +869,9 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages return array( 'wrapper' => '#ppcp-messages', 'is_hidden' => ! $this->is_pay_later_filter_enabled_for_location( $this->context() ), + 'block' => array( + 'enabled' => PayLaterBlockModule::is_enabled(), + ), 'amount' => $amount, 'placement' => $placement, 'style' => array( From 2e0845cbd4a347f5338ff25e31e719e8d61507eb Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 20 Dec 2023 09:42:25 +0200 Subject: [PATCH 31/39] Do not register block when not supported country --- modules/ppcp-paylater-block/src/PayLaterBlockModule.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/ppcp-paylater-block/src/PayLaterBlockModule.php b/modules/ppcp-paylater-block/src/PayLaterBlockModule.php index 22dba970d..4d56252b7 100644 --- a/modules/ppcp-paylater-block/src/PayLaterBlockModule.php +++ b/modules/ppcp-paylater-block/src/PayLaterBlockModule.php @@ -10,6 +10,7 @@ declare(strict_types=1); namespace WooCommerce\PayPalCommerce\PayLaterBlock; use WooCommerce\PayPalCommerce\Button\Endpoint\CartScriptParamsEndpoint; +use WooCommerce\PayPalCommerce\Button\Helper\MessagesApply; use WooCommerce\PayPalCommerce\Vendor\Dhii\Container\ServiceProvider; use WooCommerce\PayPalCommerce\Vendor\Dhii\Modular\Module\ModuleInterface; use WooCommerce\PayPalCommerce\Vendor\Interop\Container\ServiceProviderInterface; @@ -44,6 +45,13 @@ class PayLaterBlockModule implements ModuleInterface { * {@inheritDoc} */ public function run( ContainerInterface $c ): void { + $messages_apply = $c->get( 'button.helper.messages-apply' ); + assert( $messages_apply instanceof MessagesApply ); + + if ( ! $messages_apply->for_country() ) { + return; + } + add_action( 'init', function () use ( $c ): void { From 231636cbccff54b722128747fda9450bdecad434 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 20 Dec 2023 10:27:45 +0200 Subject: [PATCH 32/39] Fix .messages access --- .../resources/js/modules/ContextBootstrap/MessagesBootstap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js b/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js index 775170345..1c20e871b 100644 --- a/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js +++ b/modules/ppcp-button/resources/js/modules/ContextBootstrap/MessagesBootstap.js @@ -12,7 +12,7 @@ class MessagesBootstrap { } init() { - if (this.gateway.messages.block.enabled) { + if (this.gateway.messages?.block?.enabled) { this.discoverBlocks(); } jQuery(document.body).on('ppcp_cart_rendered ppcp_checkout_rendered', () => { From ec502024681408423877904413acd6e329c61b41 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 20 Dec 2023 10:28:05 +0200 Subject: [PATCH 33/39] Remove unused --- .../src/Settings/SettingsRenderer.php | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/modules/ppcp-wc-gateway/src/Settings/SettingsRenderer.php b/modules/ppcp-wc-gateway/src/Settings/SettingsRenderer.php index 95046579b..aa33dd28c 100644 --- a/modules/ppcp-wc-gateway/src/Settings/SettingsRenderer.php +++ b/modules/ppcp-wc-gateway/src/Settings/SettingsRenderer.php @@ -533,19 +533,5 @@ $data_rows_html state->current_state() ) { - return false; - } - - return $this->is_paypal_checkout_screen() - && ( $this->paypal_vaulting_is_enabled() || $this->settings_status->is_pay_later_messaging_enabled() ); - } } From a87eba2044c479832002b67d21d4ee3ccce512f1 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 20 Dec 2023 15:04:09 +0200 Subject: [PATCH 34/39] Use cart amount on any page --- modules/ppcp-button/src/Assets/SmartButton.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index 79977bbe5..b9959f7da 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -851,9 +851,10 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages } $product = wc_get_product(); - $amount = ( is_a( $product, WC_Product::class ) ) ? wc_get_price_including_tax( $product ) : 0; - - if ( is_checkout() || is_cart() ) { + $amount = 0; + if ( is_a( $product, WC_Product::class ) ) { + $amount = wc_get_price_including_tax( $product ); + } elseif ( isset( WC()->cart ) ) { $amount = WC()->cart->get_total( 'raw' ); } @@ -889,7 +890,6 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages 'ratio' => $ratio, ), ); - } /** From 1962823eb391adc3531c3efd79691e2adc92f8d1 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 20 Dec 2023 15:17:07 +0200 Subject: [PATCH 35/39] Split is_pay_later_messaging_enabled --- modules/ppcp-button/src/Assets/SmartButton.php | 2 +- .../src/Helper/SettingsStatus.php | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index b9959f7da..09a205941 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -394,7 +394,7 @@ class SmartButton implements SmartButtonInterface { * @return bool */ private function render_message_wrapper_registrar(): bool { - if ( ! $this->settings_status->is_pay_later_messaging_enabled() ) { + if ( ! $this->settings_status->is_pay_later_messaging_enabled() || ! $this->settings_status->has_pay_later_messaging_locations() ) { return false; } diff --git a/modules/ppcp-wc-gateway/src/Helper/SettingsStatus.php b/modules/ppcp-wc-gateway/src/Helper/SettingsStatus.php index b29b3b86a..502d7f1dc 100644 --- a/modules/ppcp-wc-gateway/src/Helper/SettingsStatus.php +++ b/modules/ppcp-wc-gateway/src/Helper/SettingsStatus.php @@ -33,15 +33,19 @@ class SettingsStatus { } /** - * Check whether Pay Later message is enabled either for checkout, cart or product page. - * - * @return bool true if is enabled, otherwise false. + * Checks whether Pay Later messaging is enabled. */ public function is_pay_later_messaging_enabled(): bool { - $messaging_enabled = $this->settings->has( 'pay_later_messaging_enabled' ) && $this->settings->get( 'pay_later_messaging_enabled' ); + return $this->settings->has( 'pay_later_messaging_enabled' ) && $this->settings->get( 'pay_later_messaging_enabled' ); + } + + /** + * Check whether any Pay Later messaging location is enabled. + */ + public function has_pay_later_messaging_locations(): bool { $selected_locations = $this->settings->has( 'pay_later_messaging_locations' ) ? $this->settings->get( 'pay_later_messaging_locations' ) : array(); - return $messaging_enabled && ! empty( $selected_locations ); + return ! empty( $selected_locations ); } /** @@ -51,7 +55,9 @@ class SettingsStatus { * @return bool true if is enabled, otherwise false. */ public function is_pay_later_messaging_enabled_for_location( string $location ): bool { - return $this->is_pay_later_messaging_enabled() && $this->is_enabled_for_location( 'pay_later_messaging_locations', $location ); + return $this->is_pay_later_messaging_enabled() && + $this->has_pay_later_messaging_locations() && + $this->is_enabled_for_location( 'pay_later_messaging_locations', $location ); } /** From f4ac4401c1d96bdfffa5a9b52dec8df62a2de192 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 20 Dec 2023 15:18:39 +0200 Subject: [PATCH 36/39] Do no load messaging (or paypal sdk) when disabled in settings --- modules/ppcp-button/src/Assets/SmartButton.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index 09a205941..d887b9bf9 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -619,6 +619,10 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages return false; } + if ( ! $this->settings_status->is_pay_later_messaging_enabled() ) { + return false; + } + if ( ! $this->messages_apply->for_country() || $this->is_free_trial_cart() ) { return false; } From fc1b5e9a1ecc9c42f57985a31627a6c0bc9a9579 Mon Sep 17 00:00:00 2001 From: Alex P Date: Wed, 20 Dec 2023 16:44:38 +0200 Subject: [PATCH 37/39] Show error message in paylater block when vaulting enabled --- .../resources/css/edit.scss | 6 +++++ .../ppcp-paylater-block/resources/js/edit.js | 27 ++++++++++++++++++- .../src/PayLaterBlockModule.php | 10 +++++-- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/modules/ppcp-paylater-block/resources/css/edit.scss b/modules/ppcp-paylater-block/resources/css/edit.scss index 010b2fd6c..ebbbb0546 100644 --- a/modules/ppcp-paylater-block/resources/css/edit.scss +++ b/modules/ppcp-paylater-block/resources/css/edit.scss @@ -11,3 +11,9 @@ .ppcp-unclicable-overlay { z-index: 10; } + +.ppcp-paylater-unavailable { + p.block-editor-warning__message { + margin-bottom: 10px; + } +} diff --git a/modules/ppcp-paylater-block/resources/js/edit.js b/modules/ppcp-paylater-block/resources/js/edit.js index c430bb501..63330318c 100644 --- a/modules/ppcp-paylater-block/resources/js/edit.js +++ b/modules/ppcp-paylater-block/resources/js/edit.js @@ -33,7 +33,11 @@ export default function Edit( { attributes, clientId, setAttributes } ) { }, }; - const props = useBlockProps({className: ['ppcp-paylater-block-preview', 'ppcp-overlay-parent']}); + let classes = ['ppcp-paylater-block-preview', 'ppcp-overlay-parent']; + if (PcpPayLaterBlock.vaultingEnabled) { + classes = ['ppcp-paylater-block-preview', 'ppcp-paylater-unavailable', 'block-editor-warning']; + } + const props = useBlockProps({className: classes}); const loadingElement =
; @@ -43,6 +47,27 @@ export default function Edit( { attributes, clientId, setAttributes } ) { } }, []); + if (PcpPayLaterBlock.vaultingEnabled) { + return
+
+

{__('PayPal Pay Later Messaging', 'woocommerce-paypal-payments')}

+

{__('Pay Later Messaging cannot be used while PayPal Vaulting is active. Disable PayPal Vaulting in the PayPal Payment settings to reactivate this block', 'woocommerce-paypal-payments')}

+
+ + + {__('PayPal Payments Settings', 'woocommerce-paypal-payments')} + + + + + +
+
+
+ } + let scriptParams = useScriptParams(PcpPayLaterBlock.ajax.cart_script_params); if (scriptParams === null) { return loadingElement; diff --git a/modules/ppcp-paylater-block/src/PayLaterBlockModule.php b/modules/ppcp-paylater-block/src/PayLaterBlockModule.php index 4d56252b7..38548feb8 100644 --- a/modules/ppcp-paylater-block/src/PayLaterBlockModule.php +++ b/modules/ppcp-paylater-block/src/PayLaterBlockModule.php @@ -15,6 +15,7 @@ use WooCommerce\PayPalCommerce\Vendor\Dhii\Container\ServiceProvider; use WooCommerce\PayPalCommerce\Vendor\Dhii\Modular\Module\ModuleInterface; use WooCommerce\PayPalCommerce\Vendor\Interop\Container\ServiceProviderInterface; use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface; +use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings; /** * Class PayLaterBlockModule @@ -52,9 +53,12 @@ class PayLaterBlockModule implements ModuleInterface { return; } + $settings = $c->get( 'wcgateway.settings' ); + assert( $settings instanceof Settings ); + add_action( 'init', - function () use ( $c ): void { + function () use ( $c, $settings ): void { $script_handle = 'ppcp-paylater-block'; wp_register_script( $script_handle, @@ -67,11 +71,13 @@ class PayLaterBlockModule implements ModuleInterface { $script_handle, 'PcpPayLaterBlock', array( - 'ajax' => array( + 'ajax' => array( 'cart_script_params' => array( 'endpoint' => \WC_AJAX::get_endpoint( CartScriptParamsEndpoint::ENDPOINT ), ), ), + 'settingsUrl' => admin_url( 'admin.php?page=wc-settings&tab=checkout§ion=ppcp-gateway' ), + 'vaultingEnabled' => $settings->has( 'vault_enabled' ) && $settings->get( 'vault_enabled' ), ) ); From 40e465857604b424741d4866d4e6029e55d98f17 Mon Sep 17 00:00:00 2001 From: Alex P Date: Fri, 5 Jan 2024 09:28:57 +0200 Subject: [PATCH 38/39] Fix buttons loading in block editor --- modules/ppcp-button/src/Assets/SmartButton.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php index d887b9bf9..189aa5ec0 100644 --- a/modules/ppcp-button/src/Assets/SmartButton.php +++ b/modules/ppcp-button/src/Assets/SmartButton.php @@ -606,7 +606,7 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages case 'product': return $smart_button_enabled_for_current_location || $smart_button_enabled_for_mini_cart; default: - return $smart_button_enabled_for_mini_cart; + return $smart_button_enabled_for_mini_cart || $this->is_block_editor(); } } From d3a318934fb23d8312d6d054fc76d6f60096404a Mon Sep 17 00:00:00 2001 From: Alex P Date: Fri, 5 Jan 2024 12:07:29 +0200 Subject: [PATCH 39/39] Fix is_editing check --- modules/ppcp-blocks/src/PayPalPaymentMethod.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ppcp-blocks/src/PayPalPaymentMethod.php b/modules/ppcp-blocks/src/PayPalPaymentMethod.php index 8d9f88540..aaeec3ea3 100644 --- a/modules/ppcp-blocks/src/PayPalPaymentMethod.php +++ b/modules/ppcp-blocks/src/PayPalPaymentMethod.php @@ -262,7 +262,7 @@ class PayPalPaymentMethod extends AbstractPaymentMethodType { */ private function is_editing(): bool { if ( ! function_exists( 'get_current_screen' ) ) { - return true; + return false; } $screen = get_current_screen(); return $screen && $screen->is_block_editor();