internal delete method to work properly \n if (fieldToOverwrite === 'mediaUrlsWithSrc'){\n const existingMediaUrls = mediaUrls.slice(0, mediaUrls.length - 1)\n return existingMediaUrls.concat(updatedImageObject)\n } else if (fieldToOverwrite === 'thumbnailWithSrc'){\n return updatedImageObject\n }\n}\n\nexport const optionallyReplaceBlobWithS3Url = ({values, s3Url, replaceBlobWithS3Url}) => {\n const { mediaUrlsWithSrc: mediaUrls, thumbnailWithSrc: thumbnail } = values\n const hasFileBeenUploaded = !!s3Url\n if (!hasFileBeenUploaded){\n return\n }\n\n const areMediaUrlsUpdated = !!mediaUrls.find( m => m.src.includes('blob') )\n const isThumbnailUpdated = thumbnail?.src.includes('blob')\n\n if (!areMediaUrlsUpdated && !isThumbnailUpdated){\n // unable to disable ImageInput so this alert is hacky solution\n alert('Unexpected state. Do not delete or upload files until the previous file has been uploaded. Refresh your browser to avoid saving corrupted data.')\n return\n }\n\n const fieldToOverwrite = areMediaUrlsUpdated ? 'mediaUrlsWithSrc' : 'thumbnailWithSrc'\n const newValue = _getNewFieldValue({fieldToOverwrite, mediaUrls, s3Url})\n\n replaceBlobWithS3Url({fieldToOverwrite, newValue})\n}\n","import React, { useEffect, useState } from 'react';\n\nimport Chip from '@material-ui/core/Chip';\n\nimport { makeRequest } from '../../../helpers';\n\nexport default ({record}) => {\n // const [categories, setCategories] = useState([]);\n // const [subcategories, setSubcategories] = useState([]);\n\n // useEffect(() => {\n // getCategories();\n // getSubcategories();\n // }, []);\n\n // const getCategories = async () => {\n // const categoriesResponse = await makeRequest('/categories');\n // setCategories(categoriesResponse);\n // };\n\n // const getSubcategories = async () => {\n // const subcategoriesResponse = await makeRequest('/subcategories');\n // setSubcategories(subcategoriesResponse);\n // };\n\n return (\n <>\n Categories\n {\n record.categories.map((category) => {\n return (\n \n );\n })\n }\n
\n {record.subcategories.length > 0 &&\n \n Subcategories\n {\n record.subcategories.map((subcategory) => {\n return (\n \n );\n })\n }\n
\n }\n >\n )\n}\n","import React, { useState } from 'react';\nimport { TextInput, Button } from 'react-admin';\nimport { useFormState, useForm } from 'react-final-form';\nimport ReactJson from 'react-json-view'\n\nimport { makeRequest } from '../../../../../helpers'\nimport { REACT_JSON_DEFAULT_PROPS } from './index'\n\nconst FindGoogleBusinessButton = ({setGooglePlace}) => {\n const { values } = useFormState();\n const { change } = useForm();\n\n const findGoogleBusiness = async () => {\n try {\n const googlePlace = await makeRequest('/providers/google_place/search', { searchTerm: values.googleNameToSearch })\n change('googlePlaceId', googlePlace.place_id)\n setGooglePlace(googlePlace)\n } catch (err){\n alert('Internal Server Error trying to find Google Place Id')\n }\n }\n\n return (\n