{"id":7362,"date":"2017-10-23T17:52:36","date_gmt":"2017-10-23T17:52:36","guid":{"rendered":"https:\/\/developers.messagemedia.com\/?p=153"},"modified":"2017-10-23T17:52:36","modified_gmt":"2017-10-23T17:52:36","slug":"blocking-page-navigation-in-a-reactjs-application","status":"publish","type":"blog","link":"https:\/\/messagemedia.com\/au\/blog\/blocking-page-navigation-in-a-reactjs-application\/","title":{"rendered":"Blocking page navigation in a ReactJS Application (React Router)"},"content":{"rendered":"<p><span class=\"md-line md-end-block\"><span class=\"\">Our product owner came to us with an interesting problem the other day, in the latest release of the MessageMedia Frontend we have a new payment portal for customers to pay invoices, when a user is in the process of paying a bill we need to block navigation, or in his words:<\/span><\/span><\/p>\n<blockquote><p><span class=\"md-line md-end-block\">As a billing contact <\/span><span class=\"md-line md-end-block\">I want to confirm my intent to leave the payment portal when my payment is still processing s<\/span><span class=\"md-line md-end-block\">o that I am aware that my payment hasn&#8217;t finished processing <\/span><\/p><\/blockquote>\n<h2 class=\"md-end-block md-heading\">Blocking page navigation with React Router<\/h2>\n<p><span class=\"md-line md-end-block\">There seems to be <span class=\"\"><a href=\"https:\/\/github.com\/ReactTraining\/react-router\/issues\/4635\">quite a few<\/a><\/span> methods of achieving this but most are pre v4\u2026<\/span><\/p>\n<h3 class=\"md-end-block md-heading\">Let\u2019s go to the docs<\/h3>\n<p><span class=\"md-line md-end-block\">React Router have a <span class=\"\"><a href=\"https:\/\/reacttraining.com\/react-router\/core\/guides\/philosophy\">great online documentation<\/a><\/span> portal available, upon a quick search we find the <code>&lt;Prompt \/&gt;<\/code> method.<\/span><\/p>\n<blockquote><p><span class=\"md-line md-end-block\">Prompt the user before navigating away from a page. <\/span><\/p><\/blockquote>\n<p><span class=\"md-line md-end-block\">Great! Let\u2019s create a simple component to test.<\/span><\/p>\n<h3 class=\"md-end-block md-heading\">Simple NavigationBlocker Component<\/h3>\n<pre class=\"md-fences md-end-block\"><span role=\"presentation\">import React from 'react'<\/span>\n<span role=\"presentation\">import PropTypes from 'prop-types'<\/span>\n<span role=\"presentation\">import { Prompt } from 'react-router-dom'<\/span>\n<span role=\"presentation\">\u200b<\/span>\n<span role=\"presentation\">const NavigationBlocker = (props) =&gt; (<\/span>\n<span role=\"presentation\">  &lt;Prompt<\/span>\n<span role=\"presentation\"> \u00a0  when={props.navigationBlocked}<\/span>\n<span role=\"presentation\"> \u00a0  message=\"Are you sure you want to leave?\"<\/span>\n<span role=\"presentation\">  \/&gt;<\/span>\n<span role=\"presentation\">)<\/span>\n<span role=\"presentation\">\u200b<\/span>\n<span role=\"presentation\">NavigationBlocker.propTypes = {<\/span>\n<span role=\"presentation\">  navigationBlocked: PropTypes.bool.isRequired,<\/span>\n<span role=\"presentation\">}<\/span>\n<span role=\"presentation\">\u200b<\/span>\n<span role=\"presentation\">export default NavigationBlocker<\/span><\/pre>\n<p><span class=\"md-line md-end-block\">\/ Note: I\u2019m specifically using <code>react-router-dom<\/code> but you can use plain ol\u2019 <code>react-router<\/code> for this \/<\/span><\/p>\n<div class=\"md-hr md-end-block\">\n<hr \/>\n<\/div>\n<p><span class=\"md-line md-end-block\">Users should now see a prompt when clicking on links between routes but what about browser actions eg. Back \/ Forward buttons, Reload or Close?<\/span><\/p>\n<h2 class=\"md-end-block md-heading\">Blocking browser navigation with <code>onbeforeunload<\/code><\/h2>\n<p><span class=\"md-line md-end-block\">Once again you\u2019re going to find many articles \/ stack overflow questions \/ tweets on how to implement this so I\u2019d suggest &#8211;\u00a0<\/span><\/p>\n<h3 class=\"md-end-block md-heading\">Go back to the docs<\/h3>\n<p><span class=\"md-line md-end-block\">As per the <span class=\"\"><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/WindowEventHandlers\/onbeforeunload\">MDN Documentation<\/a><\/span>:<\/span><\/p>\n<blockquote><p><span class=\"md-line md-end-block\">The <code>WindowEventHandlers.onbeforeunload<\/code> event handler property contains the code executed when the <code>beforeunload<\/code> is sent. <\/span><\/p><\/blockquote>\n<p><span class=\"md-line md-end-block\">The problem is there\u2019s many ways to implement this but as of 2017 most browsers block custom messages (for security reasons), as we don\u2019t need to worry about this we can use something as simple as:<\/span><\/p>\n<pre class=\"md-fences md-end-block\"><span role=\"presentation\">\/\/ Enable navigation prompt<\/span>\n<span role=\"presentation\">window.onbeforeunload = () =&gt; true<\/span>\n<span role=\"presentation\">\/\/ Remove navigation prompt<\/span>\n<span role=\"presentation\">window.onbeforeunload = null<\/span><\/pre>\n<h3 class=\"md-end-block md-heading\">Let\u2019s add it to our existing component<\/h3>\n<pre class=\"md-fences md-end-block\"><span role=\"presentation\">import React from 'react'<\/span>\n<span role=\"presentation\">import PropTypes from 'prop-types'<\/span>\n<span role=\"presentation\">import { Prompt } from 'react-router-dom'<\/span>\n<span role=\"presentation\">\u200b<\/span>\n<span role=\"presentation\">const NavigationBlocker = (props) =&gt; {<\/span>\n<span role=\"presentation\">  if (props.navigationBlocked) {<\/span>\n<span role=\"presentation\"> \u00a0  window.onbeforeunload = () =&gt; true<\/span>\n<span role=\"presentation\">  } else {<\/span>\n<span role=\"presentation\"> \u00a0  window.onbeforeunload = null<\/span>\n<span role=\"presentation\">  }<\/span>\n<span role=\"presentation\">  return (<\/span>\n<span role=\"presentation\"> \u00a0  &lt;Prompt<\/span>\n<span role=\"presentation\"> \u00a0 \u00a0  when={props.navigationBlocked}<\/span>\n<span role=\"presentation\"> \u00a0 \u00a0  message=\"Are you sure you want to leave?\"<\/span>\n<span role=\"presentation\"> \u00a0  \/&gt;<\/span>\n<span role=\"presentation\">  )<\/span>\n<span role=\"presentation\">}<\/span>\n<span role=\"presentation\">\u200b<\/span>\n<span role=\"presentation\">NavigationBlocker.propTypes = {<\/span>\n<span role=\"presentation\">  navigationBlocked: PropTypes.bool.isRequired,<\/span>\n<span role=\"presentation\">}<\/span>\n<span role=\"presentation\">\u200b<\/span>\n<span role=\"presentation\">export default NavigationBlocker<\/span><\/pre>\n<p><span class=\"md-line md-end-block\">And just like that we have a navigation blocking component that we can easily turn on and off.<\/span><\/p>\n<h2 class=\"md-end-block md-heading\">Extending it with Redux<\/h2>\n<p><span class=\"md-line md-end-block\">I would suggest extending it to be a Global Navigation Blocker from here, when a processing redux action is sent send another to block navigation, when it resolves send another to resolve.<\/span><\/p>\n<p><span class=\"md-line md-end-block\">This allows you to include the blocker once at app level rather than including every time you need it.<\/span><\/p>\n<p><span class=\"md-line md-end-block\">This is what my implementation ended up looking like:<\/span><\/p>\n<pre class=\"md-fences md-end-block\"><span role=\"presentation\">import React from 'react'<\/span>\n<span role=\"presentation\">import PropTypes from 'prop-types'<\/span>\n<span role=\"presentation\">import { connect } from 'react-redux'<\/span>\n<span role=\"presentation\">import { Prompt } from 'react-router-dom'<\/span>\n<span role=\"presentation\">\u200b<\/span>\n<span role=\"presentation\">import { getNavigationBlocked } from '..\/navigation-selectors'<\/span>\n<span role=\"presentation\">\u200b<\/span>\n<span role=\"presentation\">const GlobalNavigationBlocker = (props) =&gt; {<\/span>\n<span role=\"presentation\">  if (props.navigationBlocked) {<\/span>\n<span role=\"presentation\"> \u00a0  window.onbeforeunload = () =&gt; true<\/span>\n<span role=\"presentation\">  } else {<\/span>\n<span role=\"presentation\"> \u00a0  window.onbeforeunload = null<\/span>\n<span role=\"presentation\">  }<\/span>\n<span role=\"presentation\">  return (<\/span>\n<span role=\"presentation\"> \u00a0  &lt;Prompt<\/span>\n<span role=\"presentation\"> \u00a0 \u00a0  when={props.navigationBlocked}<\/span>\n<span role=\"presentation\"> \u00a0 \u00a0  message=\"Are you sure you want to leave?\"<\/span>\n<span role=\"presentation\"> \u00a0  \/&gt;<\/span>\n<span role=\"presentation\">  )<\/span>\n<span role=\"presentation\">}<\/span>\n<span role=\"presentation\">\u200b<\/span>\n<span role=\"presentation\">GlobalNavigationBlocker.propTypes = {<\/span>\n<span role=\"presentation\">  navigationBlocked: PropTypes.bool.isRequired,<\/span>\n<span role=\"presentation\">}<\/span>\n<span role=\"presentation\">\u200b<\/span>\n<span role=\"presentation\">export const mapStateToProps = state =&gt; ({<\/span>\n<span role=\"presentation\">  navigationBlocked: getNavigationBlocked(state),<\/span>\n<span role=\"presentation\">})<\/span>\n<span role=\"presentation\">\u200b<\/span>\n<span role=\"presentation\">export default connect(mapStateToProps)(GlobalNavigationBlocker)<\/span><\/pre>\n<h2 class=\"md-end-block md-heading\">Drawbacks<\/h2>\n<p><span class=\"md-line md-end-block\">Unfortunately because of how <code>onbeforeunload<\/code> can be misused, modern browsers have implemented some safeguards, as described in the docs:<\/span><\/p>\n<blockquote><p><span class=\"md-line md-end-block\">To combat unwanted pop-ups, some browsers don&#8217;t display prompts created in <code>beforeunload<\/code> event handlers unless the page has been interacted with; some don&#8217;t display them at all. <\/span><\/p><\/blockquote>\n<p><span class=\"md-line md-end-block\">And<\/span><\/p>\n<blockquote><p><span class=\"md-line md-end-block\">Various browsers ignore the result of the event and do not ask the user for confirmation at all \u2026 Firefox has a switch named <code>dom.disable_beforeunload<\/code> in about:config to enable this behaviour. (For eg.) <\/span><\/p><\/blockquote>\n<p><span class=\"md-line md-end-block\">Or, TL;DR:<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"*\">\n<li><span class=\"md-line md-end-block\">The user must interact with the page or the <code>onbeforeunload<\/code> event will not fire<\/span><\/li>\n<li><span class=\"md-line md-end-block\"><code>onbeforeunload<\/code> can be turned off with browser settings<\/span>\n<ul class=\"ul-list\" data-mark=\"*\">\n<li><span class=\"md-line md-end-block\"><span class=\"\"><a href=\"https:\/\/stackoverflow.com\/a\/18115932\">There are ways around this<\/a><\/span> using heavier handed approaches but I would not recommend them<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span class=\"md-line md-end-block\">You, also, cannot specify what message is shown to the user during this interaction.<\/span><\/p>\n<p><span class=\"md-line md-end-block\">All in all, I hope this saved you some time researching!<\/span><\/p>\n","protected":false},"author":0,"featured_media":8966,"menu_order":240,"template":"page-blog-v2.php","meta":{"_acf_changed":false,"popular":false,"coming_soon":false,"link":"","footnotes":""},"blog_category":[37],"class_list":["post-7362","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-developers"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Blocking Page Navigation in a ReactJS Application | MessageMedia Australia<\/title>\n<meta name=\"description\" content=\"Our product owner came to us with an interesting problem the other day, in the latest release of the MessageMedia Frontend we have a new payment portal for customers to pay invoices, when a user is in the process of paying a bill we need to block navigation Australia\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/messagemedia.com\/au\/blog\/blocking-page-navigation-in-a-reactjs-application\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Blocking Page Navigation in a ReactJS Application | MessageMedia\" \/>\n<meta property=\"og:description\" content=\"Our product owner came to us with an interesting problem the other day, in the latest release of the MessageMedia Frontend we have a new payment portal for customers to pay invoices, when a user is in the process of paying a bill we need to block navigation\" \/>\n<meta property=\"og:url\" content=\"https:\/\/messagemedia.com\/au\/blog\/blocking-page-navigation-in-a-reactjs-application\/\" \/>\n<meta property=\"og:site_name\" content=\"Sinch MessageMedia\" \/>\n<meta property=\"og:image\" content=\"https:\/\/messagemedia.com\/wp-content\/uploads\/2017\/10\/Blocking-page-navigation-in-a-ReactJS-Application-React-Router.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"325\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/blog\\\/blocking-page-navigation-in-a-reactjs-application\\\/\",\"url\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/blog\\\/blocking-page-navigation-in-a-reactjs-application\\\/\",\"name\":\"Blocking Page Navigation in a ReactJS Application | MessageMedia\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/blog\\\/blocking-page-navigation-in-a-reactjs-application\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/blog\\\/blocking-page-navigation-in-a-reactjs-application\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/messagemedia.com\\\/wp-content\\\/uploads\\\/2017\\\/10\\\/Blocking-page-navigation-in-a-ReactJS-Application-React-Router.jpg\",\"datePublished\":\"2017-10-23T17:52:36+00:00\",\"description\":\"Our product owner came to us with an interesting problem the other day, in the latest release of the MessageMedia Frontend we have a new payment portal for customers to pay invoices, when a user is in the process of paying a bill we need to block navigation\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/blog\\\/blocking-page-navigation-in-a-reactjs-application\\\/#breadcrumb\"},\"inLanguage\":\"en-AU\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/messagemedia.com\\\/au\\\/blog\\\/blocking-page-navigation-in-a-reactjs-application\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-AU\",\"@id\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/blog\\\/blocking-page-navigation-in-a-reactjs-application\\\/#primaryimage\",\"url\":\"https:\\\/\\\/messagemedia.com\\\/wp-content\\\/uploads\\\/2017\\\/10\\\/Blocking-page-navigation-in-a-ReactJS-Application-React-Router.jpg\",\"contentUrl\":\"https:\\\/\\\/messagemedia.com\\\/wp-content\\\/uploads\\\/2017\\\/10\\\/Blocking-page-navigation-in-a-ReactJS-Application-React-Router.jpg\",\"width\":1024,\"height\":325,\"caption\":\"Blocking page navigation in a ReactJS Application React Router\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/blog\\\/blocking-page-navigation-in-a-reactjs-application\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/messagemedia.com\\\/us\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Blocking page navigation in a ReactJS Application (React Router)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/#website\",\"url\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/\",\"name\":\"Sinch MessageMedia\",\"description\":\"Business SMS &amp; Messaging Platform\",\"publisher\":{\"@id\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-AU\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/#organization\",\"name\":\"Sinch MessageMedia\",\"url\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-AU\",\"@id\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/messagemedia.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/logo-mm-sinch.svg\",\"contentUrl\":\"https:\\\/\\\/messagemedia.com\\\/wp-content\\\/uploads\\\/2024\\\/03\\\/logo-mm-sinch.svg\",\"width\":1,\"height\":1,\"caption\":\"Sinch MessageMedia\"},\"image\":{\"@id\":\"https:\\\/\\\/messagemedia.com\\\/au\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Blocking Page Navigation in a ReactJS Application | MessageMedia Australia","description":"Our product owner came to us with an interesting problem the other day, in the latest release of the MessageMedia Frontend we have a new payment portal for customers to pay invoices, when a user is in the process of paying a bill we need to block navigation Australia","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/messagemedia.com\/au\/blog\/blocking-page-navigation-in-a-reactjs-application\/","og_locale":"en_US","og_type":"article","og_title":"Blocking Page Navigation in a ReactJS Application | MessageMedia","og_description":"Our product owner came to us with an interesting problem the other day, in the latest release of the MessageMedia Frontend we have a new payment portal for customers to pay invoices, when a user is in the process of paying a bill we need to block navigation","og_url":"https:\/\/messagemedia.com\/au\/blog\/blocking-page-navigation-in-a-reactjs-application\/","og_site_name":"Sinch MessageMedia","og_image":[{"width":1024,"height":325,"url":"https:\/\/messagemedia.com\/wp-content\/uploads\/2017\/10\/Blocking-page-navigation-in-a-ReactJS-Application-React-Router.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/messagemedia.com\/au\/blog\/blocking-page-navigation-in-a-reactjs-application\/","url":"https:\/\/messagemedia.com\/au\/blog\/blocking-page-navigation-in-a-reactjs-application\/","name":"Blocking Page Navigation in a ReactJS Application | MessageMedia","isPartOf":{"@id":"https:\/\/messagemedia.com\/au\/#website"},"primaryImageOfPage":{"@id":"https:\/\/messagemedia.com\/au\/blog\/blocking-page-navigation-in-a-reactjs-application\/#primaryimage"},"image":{"@id":"https:\/\/messagemedia.com\/au\/blog\/blocking-page-navigation-in-a-reactjs-application\/#primaryimage"},"thumbnailUrl":"https:\/\/messagemedia.com\/wp-content\/uploads\/2017\/10\/Blocking-page-navigation-in-a-ReactJS-Application-React-Router.jpg","datePublished":"2017-10-23T17:52:36+00:00","description":"Our product owner came to us with an interesting problem the other day, in the latest release of the MessageMedia Frontend we have a new payment portal for customers to pay invoices, when a user is in the process of paying a bill we need to block navigation","breadcrumb":{"@id":"https:\/\/messagemedia.com\/au\/blog\/blocking-page-navigation-in-a-reactjs-application\/#breadcrumb"},"inLanguage":"en-AU","potentialAction":[{"@type":"ReadAction","target":["https:\/\/messagemedia.com\/au\/blog\/blocking-page-navigation-in-a-reactjs-application\/"]}]},{"@type":"ImageObject","inLanguage":"en-AU","@id":"https:\/\/messagemedia.com\/au\/blog\/blocking-page-navigation-in-a-reactjs-application\/#primaryimage","url":"https:\/\/messagemedia.com\/wp-content\/uploads\/2017\/10\/Blocking-page-navigation-in-a-ReactJS-Application-React-Router.jpg","contentUrl":"https:\/\/messagemedia.com\/wp-content\/uploads\/2017\/10\/Blocking-page-navigation-in-a-ReactJS-Application-React-Router.jpg","width":1024,"height":325,"caption":"Blocking page navigation in a ReactJS Application React Router"},{"@type":"BreadcrumbList","@id":"https:\/\/messagemedia.com\/au\/blog\/blocking-page-navigation-in-a-reactjs-application\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/messagemedia.com\/au\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/messagemedia.com\/us\/blog\/"},{"@type":"ListItem","position":3,"name":"Blocking page navigation in a ReactJS Application (React Router)"}]},{"@type":"WebSite","@id":"https:\/\/messagemedia.com\/au\/#website","url":"https:\/\/messagemedia.com\/au\/","name":"Sinch MessageMedia","description":"Business SMS &amp; Messaging Platform","publisher":{"@id":"https:\/\/messagemedia.com\/au\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/messagemedia.com\/au\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-AU"},{"@type":"Organization","@id":"https:\/\/messagemedia.com\/au\/#organization","name":"Sinch MessageMedia","url":"https:\/\/messagemedia.com\/au\/","logo":{"@type":"ImageObject","inLanguage":"en-AU","@id":"https:\/\/messagemedia.com\/au\/#\/schema\/logo\/image\/","url":"https:\/\/messagemedia.com\/wp-content\/uploads\/2024\/03\/logo-mm-sinch.svg","contentUrl":"https:\/\/messagemedia.com\/wp-content\/uploads\/2024\/03\/logo-mm-sinch.svg","width":1,"height":1,"caption":"Sinch MessageMedia"},"image":{"@id":"https:\/\/messagemedia.com\/au\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/messagemedia.com\/au\/wp-json\/wp\/v2\/blog\/7362","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/messagemedia.com\/au\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/messagemedia.com\/au\/wp-json\/wp\/v2\/types\/blog"}],"version-history":[{"count":0,"href":"https:\/\/messagemedia.com\/au\/wp-json\/wp\/v2\/blog\/7362\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/messagemedia.com\/au\/wp-json\/wp\/v2\/media\/8966"}],"wp:attachment":[{"href":"https:\/\/messagemedia.com\/au\/wp-json\/wp\/v2\/media?parent=7362"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/messagemedia.com\/au\/wp-json\/wp\/v2\/blog_category?post=7362"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}