diff --git a/apps/reference/_supabase_js/working-with-types.md b/apps/reference/_supabase_js/working-with-types.md index 90314b8fa92..519650ed995 100644 --- a/apps/reference/_supabase_js/working-with-types.md +++ b/apps/reference/_supabase_js/working-with-types.md @@ -76,9 +76,9 @@ async function getMovies() { return await supabase.from('movies').select('id, title, actors(*)') } -type actors = Database['public']['Tables']['actors']['Row'] +type Actors = Database['public']['Tables']['actors']['Row'] type MoviesResponse = Awaited> type MoviesResponseSuccess = MoviesResponse['data'] & { - actors: actors[] + actors: Actors[] } ``` diff --git a/apps/www/components/EnterpriseContactForm.tsx b/apps/www/components/EnterpriseContactForm.tsx index ccbec6d937e..49850842d07 100644 --- a/apps/www/components/EnterpriseContactForm.tsx +++ b/apps/www/components/EnterpriseContactForm.tsx @@ -68,105 +68,116 @@ const EnterpriseContactForm = () => { return (
- {({ isSubmitting }: any) => ( -
-
- -
+ {({ values, isSubmitting }: any) => { + const selectedCountry = countries.find((country) => country.code === values['country']) + const phonePlaceholder = + selectedCountry !== undefined ? `+${selectedCountry.phone_code}` : '' -
-
+ return ( +
+
-
+
+
+ +
+ +
+ +
+
+ +
-
-
- -
+
+ +
-
- -
+
+ +
-
- -
+
+ +
-
- -
+
+ +
-
- +
+ +
- -
- -
-
- )} + ) + }} {formSubmitted && ( diff --git a/apps/www/components/SOC2RequestForm.tsx b/apps/www/components/SOC2RequestForm.tsx new file mode 100644 index 00000000000..fecd010ddee --- /dev/null +++ b/apps/www/components/SOC2RequestForm.tsx @@ -0,0 +1,205 @@ +import { Button, Form, Input, Select } from '@supabase/ui' +import { useState } from 'react' +import countries from '~/data/Countries.json' +import supabase from '~/lib/supabase' + +const INITIAL_VALUES = { + companyName: '', + contactFirstName: '', + contactLastName: '', + contactEmail: '', + contactPhone: '', + companySize: '', + details: '', + country: 'US', +} + +const validate = (values: any) => { + const errors: any = {} + + if (!values.companyName) { + errors.companyName = 'Required' + } + + if (!values.contactFirstName) { + errors.contactFirstName = 'Required' + } + + if (!values.contactLastName) { + errors.contactLastName = 'Required' + } + + if (!values.contactEmail) { + errors.contactEmail = 'Required' + } else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(values.contactEmail)) { + errors.contactEmail = 'Invalid email address' + } + + return errors +} + +const SOC2RequestForm = () => { + const [error, setError] = useState() + const [formSubmitted, setFormSubmitted] = useState(false) + + const handleFormSubmit = async (values: typeof INITIAL_VALUES, { resetForm }: any) => { + const { error } = await supabase.from('soc2_requests').insert([ + { + company_name: values.companyName, + contact_name: `${values.contactFirstName} ${values.contactLastName}`, + contact_first_name: values.contactFirstName, + contact_last_name: values.contactLastName, + contact_email: values.contactEmail, + contact_phone: values.contactPhone, + company_size: values.companySize, + details: values.details, + country: values.country, + }, + ]) + + if (!error) { + resetForm() + setFormSubmitted(true) + } else { + setError(error.message) + } + } + + return ( +
+ {formSubmitted ? ( +

+ Thank you for your submission! A member from the Supabase team will reach out to you + shortly! +

+ ) : ( + <> +
+ {({ values, isSubmitting }: any) => { + const selectedCountry = countries.find( + (country) => country.code === values['country'] + ) + const phonePlaceholder = + selectedCountry !== undefined ? `+${selectedCountry.phone_code}` : '' + + return ( +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ ) + }} +
+ {error &&

Error: {error}

} + + )} +
+ ) +} + +export default SOC2RequestForm diff --git a/apps/www/data/Countries.json b/apps/www/data/Countries.json index 5df305aeb22..29b926bf959 100644 --- a/apps/www/data/Countries.json +++ b/apps/www/data/Countries.json @@ -1,1002 +1,1252 @@ [ { "code": "AF", - "name": "Afghanistan" + "name": "Afghanistan", + "phone_code": "93" }, { "code": "AX", - "name": "Aland Islands" + "name": "Aland Islands", + "phone_code": "358-18" }, { "code": "AL", - "name": "Albania" + "name": "Albania", + "phone_code": "355" }, { "code": "DZ", - "name": "Algeria" + "name": "Algeria", + "phone_code": "213" }, { "code": "AS", - "name": "American Samoa" + "name": "American Samoa", + "phone_code": "1-684" }, { "code": "AD", - "name": "Andorra" + "name": "Andorra", + "phone_code": "376" }, { "code": "AO", - "name": "Angola" + "name": "Angola", + "phone_code": "244" }, { "code": "AI", - "name": "Anguilla" + "name": "Anguilla", + "phone_code": "1-264" }, { "code": "AQ", - "name": "Antarctica" + "name": "Antarctica", + "phone_code": "" }, { "code": "AG", - "name": "Antigua and Barbuda" + "name": "Antigua and Barbuda", + "phone_code": "1-268" }, { "code": "AR", - "name": "Argentina" + "name": "Argentina", + "phone_code": "54" }, { "code": "AM", - "name": "Armenia" + "name": "Armenia", + "phone_code": "374" }, { "code": "AW", - "name": "Aruba" + "name": "Aruba", + "phone_code": "297" }, { "code": "AU", - "name": "Australia" + "name": "Australia", + "phone_code": "61" }, { "code": "AT", - "name": "Austria" + "name": "Austria", + "phone_code": "43" }, { "code": "AZ", - "name": "Azerbaijan" + "name": "Azerbaijan", + "phone_code": "994" }, { "code": "BS", - "name": "Bahamas" + "name": "Bahamas", + "phone_code": "1-242" }, { "code": "BH", - "name": "Bahrain" + "name": "Bahrain", + "phone_code": "973" }, { "code": "BD", - "name": "Bangladesh" + "name": "Bangladesh", + "phone_code": "880" }, { "code": "BB", - "name": "Barbados" + "name": "Barbados", + "phone_code": "1-246" }, { "code": "BY", - "name": "Belarus" + "name": "Belarus", + "phone_code": "375" }, { "code": "BE", - "name": "Belgium" + "name": "Belgium", + "phone_code": "32" }, { "code": "BZ", - "name": "Belize" + "name": "Belize", + "phone_code": "501" }, { "code": "BJ", - "name": "Benin" + "name": "Benin", + "phone_code": "229" }, { "code": "BM", - "name": "Bermuda" + "name": "Bermuda", + "phone_code": "1-441" }, { "code": "BT", - "name": "Bhutan" + "name": "Bhutan", + "phone_code": "975" }, { "code": "BO", - "name": "Bolivia" + "name": "Bolivia", + "phone_code": "591" }, { "code": "BQ", - "name": "Bonaire, Saint Eustatius and Saba " + "name": "Bonaire, Saint Eustatius and Saba ", + "phone_code": "599" }, { "code": "BA", - "name": "Bosnia and Herzegovina" + "name": "Bosnia and Herzegovina", + "phone_code": "387" }, { "code": "BW", - "name": "Botswana" + "name": "Botswana", + "phone_code": "267" }, { "code": "BV", - "name": "Bouvet Island" + "name": "Bouvet Island", + "phone_code": "" }, { "code": "BR", - "name": "Brazil" + "name": "Brazil", + "phone_code": "55" }, { "code": "IO", - "name": "British Indian Ocean Territory" + "name": "British Indian Ocean Territory", + "phone_code": "246" }, { "code": "VG", - "name": "British Virgin Islands" + "name": "British Virgin Islands", + "phone_code": "1-284" }, { "code": "BN", - "name": "Brunei" + "name": "Brunei", + "phone_code": "673" }, { "code": "BG", - "name": "Bulgaria" + "name": "Bulgaria", + "phone_code": "359" }, { "code": "BF", - "name": "Burkina Faso" + "name": "Burkina Faso", + "phone_code": "226" }, { "code": "BI", - "name": "Burundi" + "name": "Burundi", + "phone_code": "257" }, { "code": "KH", - "name": "Cambodia" + "name": "Cambodia", + "phone_code": "855" }, { "code": "CM", - "name": "Cameroon" + "name": "Cameroon", + "phone_code": "237" }, { "code": "CA", - "name": "Canada" + "name": "Canada", + "phone_code": "1" }, { "code": "CV", - "name": "Cape Verde" + "name": "Cape Verde", + "phone_code": "238" }, { "code": "KY", - "name": "Cayman Islands" + "name": "Cayman Islands", + "phone_code": "1-345" }, { "code": "CF", - "name": "Central African Republic" + "name": "Central African Republic", + "phone_code": "236" }, { "code": "TD", - "name": "Chad" + "name": "Chad", + "phone_code": "235" }, { "code": "CL", - "name": "Chile" + "name": "Chile", + "phone_code": "56" }, { "code": "CN", - "name": "China" + "name": "China", + "phone_code": "86" }, { "code": "CX", - "name": "Christmas Island" + "name": "Christmas Island", + "phone_code": "61" }, { "code": "CC", - "name": "Cocos Islands" + "name": "Cocos Islands", + "phone_code": "61" }, { "code": "CO", - "name": "Colombia" + "name": "Colombia", + "phone_code": "57" }, { "code": "KM", - "name": "Comoros" + "name": "Comoros", + "phone_code": "269" }, { "code": "CK", - "name": "Cook Islands" + "name": "Cook Islands", + "phone_code": "682" }, { "code": "CR", - "name": "Costa Rica" + "name": "Costa Rica", + "phone_code": "506" }, { "code": "HR", - "name": "Croatia" + "name": "Croatia", + "phone_code": "385" }, { "code": "CU", - "name": "Cuba" + "name": "Cuba", + "phone_code": "53" }, { "code": "CW", - "name": "Curacao" + "name": "Curacao", + "phone_code": "599" }, { "code": "CY", - "name": "Cyprus" + "name": "Cyprus", + "phone_code": "357" }, { "code": "CZ", - "name": "Czech Republic" + "name": "Czech Republic", + "phone_code": "420" }, { "code": "CD", - "name": "Democratic Republic of the Congo" + "name": "Democratic Republic of the Congo", + "phone_code": "243" }, { "code": "DK", - "name": "Denmark" + "name": "Denmark", + "phone_code": "45" }, { "code": "DJ", - "name": "Djibouti" + "name": "Djibouti", + "phone_code": "253" }, { "code": "DM", - "name": "Dominica" + "name": "Dominica", + "phone_code": "1-767" }, { "code": "DO", - "name": "Dominican Republic" + "name": "Dominican Republic", + "phone_code": "1-809 and 1-829" }, { "code": "TL", - "name": "East Timor" + "name": "East Timor", + "phone_code": "670" }, { "code": "EC", - "name": "Ecuador" + "name": "Ecuador", + "phone_code": "593" }, { "code": "EG", - "name": "Egypt" + "name": "Egypt", + "phone_code": "20" }, { "code": "SV", - "name": "El Salvador" + "name": "El Salvador", + "phone_code": "503" }, { "code": "GQ", - "name": "Equatorial Guinea" + "name": "Equatorial Guinea", + "phone_code": "240" }, { "code": "ER", - "name": "Eritrea" + "name": "Eritrea", + "phone_code": "291" }, { "code": "EE", - "name": "Estonia" + "name": "Estonia", + "phone_code": "372" }, { "code": "ET", - "name": "Ethiopia" + "name": "Ethiopia", + "phone_code": "251" }, { "code": "FK", - "name": "Falkland Islands" + "name": "Falkland Islands", + "phone_code": "500" }, { "code": "FO", - "name": "Faroe Islands" + "name": "Faroe Islands", + "phone_code": "298" }, { "code": "FJ", - "name": "Fiji" + "name": "Fiji", + "phone_code": "679" }, { "code": "FI", - "name": "Finland" + "name": "Finland", + "phone_code": "358" }, { "code": "FR", - "name": "France" + "name": "France", + "phone_code": "33" }, { "code": "GF", - "name": "French Guiana" + "name": "French Guiana", + "phone_code": "594" }, { "code": "PF", - "name": "French Polynesia" + "name": "French Polynesia", + "phone_code": "689" }, { "code": "TF", - "name": "French Southern Territories" + "name": "French Southern Territories", + "phone_code": "" }, { "code": "GA", - "name": "Gabon" + "name": "Gabon", + "phone_code": "241" }, { "code": "GM", - "name": "Gambia" + "name": "Gambia", + "phone_code": "220" }, { "code": "GE", - "name": "Georgia" + "name": "Georgia", + "phone_code": "995" }, { "code": "DE", - "name": "Germany" + "name": "Germany", + "phone_code": "49" }, { "code": "GH", - "name": "Ghana" + "name": "Ghana", + "phone_code": "233" }, { "code": "GI", - "name": "Gibraltar" + "name": "Gibraltar", + "phone_code": "350" }, { "code": "GR", - "name": "Greece" + "name": "Greece", + "phone_code": "30" }, { "code": "GL", - "name": "Greenland" + "name": "Greenland", + "phone_code": "299" }, { "code": "GD", - "name": "Grenada" + "name": "Grenada", + "phone_code": "1-473" }, { "code": "GP", - "name": "Guadeloupe" + "name": "Guadeloupe", + "phone_code": "590" }, { "code": "GU", - "name": "Guam" + "name": "Guam", + "phone_code": "1-671" }, { "code": "GT", - "name": "Guatemala" + "name": "Guatemala", + "phone_code": "502" }, { "code": "GG", - "name": "Guernsey" + "name": "Guernsey", + "phone_code": "44-1481" }, { "code": "GN", - "name": "Guinea" + "name": "Guinea", + "phone_code": "224" }, { "code": "GW", - "name": "Guinea-Bissau" + "name": "Guinea-Bissau", + "phone_code": "245" }, { "code": "GY", - "name": "Guyana" + "name": "Guyana", + "phone_code": "592" }, { "code": "HT", - "name": "Haiti" + "name": "Haiti", + "phone_code": "509" }, { "code": "HM", - "name": "Heard Island and McDonald Islands" + "name": "Heard Island and McDonald Islands", + "phone_code": " " }, { "code": "HN", - "name": "Honduras" + "name": "Honduras", + "phone_code": "504" }, { "code": "HK", - "name": "Hong Kong" + "name": "Hong Kong", + "phone_code": "852" }, { "code": "HU", - "name": "Hungary" + "name": "Hungary", + "phone_code": "36" }, { "code": "IS", - "name": "Iceland" + "name": "Iceland", + "phone_code": "354" }, { "code": "IN", - "name": "India" + "name": "India", + "phone_code": "91" }, { "code": "ID", - "name": "Indonesia" + "name": "Indonesia", + "phone_code": "62" }, { "code": "IR", - "name": "Iran" + "name": "Iran", + "phone_code": "98" }, { "code": "IQ", - "name": "Iraq" + "name": "Iraq", + "phone_code": "964" }, { "code": "IE", - "name": "Ireland" + "name": "Ireland", + "phone_code": "353" }, { "code": "IM", - "name": "Isle of Man" + "name": "Isle of Man", + "phone_code": "44-1624" }, { "code": "IL", - "name": "Israel" + "name": "Israel", + "phone_code": "972" }, { "code": "IT", - "name": "Italy" + "name": "Italy", + "phone_code": "39" }, { "code": "CI", - "name": "Ivory Coast" + "name": "Ivory Coast", + "phone_code": "225" }, { "code": "JM", - "name": "Jamaica" + "name": "Jamaica", + "phone_code": "1-876" }, { "code": "JP", - "name": "Japan" + "name": "Japan", + "phone_code": "81" }, { "code": "JE", - "name": "Jersey" + "name": "Jersey", + "phone_code": "44-1534" }, { "code": "JO", - "name": "Jordan" + "name": "Jordan", + "phone_code": "962" }, { "code": "KZ", - "name": "Kazakhstan" + "name": "Kazakhstan", + "phone_code": "7" }, { "code": "KE", - "name": "Kenya" + "name": "Kenya", + "phone_code": "254" }, { "code": "KI", - "name": "Kiribati" + "name": "Kiribati", + "phone_code": "686" }, { "code": "XK", - "name": "Kosovo" + "name": "Kosovo", + "phone_code": "" }, { "code": "KW", - "name": "Kuwait" + "name": "Kuwait", + "phone_code": "965" }, { "code": "KG", - "name": "Kyrgyzstan" + "name": "Kyrgyzstan", + "phone_code": "996" }, { "code": "LA", - "name": "Laos" + "name": "Laos", + "phone_code": "856" }, { "code": "LV", - "name": "Latvia" + "name": "Latvia", + "phone_code": "371" }, { "code": "LB", - "name": "Lebanon" + "name": "Lebanon", + "phone_code": "961" }, { "code": "LS", - "name": "Lesotho" + "name": "Lesotho", + "phone_code": "266" }, { "code": "LR", - "name": "Liberia" + "name": "Liberia", + "phone_code": "231" }, { "code": "LY", - "name": "Libya" + "name": "Libya", + "phone_code": "218" }, { "code": "LI", - "name": "Liechtenstein" + "name": "Liechtenstein", + "phone_code": "423" }, { "code": "LT", - "name": "Lithuania" + "name": "Lithuania", + "phone_code": "370" }, { "code": "LU", - "name": "Luxembourg" + "name": "Luxembourg", + "phone_code": "352" }, { "code": "MO", - "name": "Macao" + "name": "Macao", + "phone_code": "853" }, { "code": "MK", - "name": "Macedonia" + "name": "Macedonia", + "phone_code": "389" }, { "code": "MG", - "name": "Madagascar" + "name": "Madagascar", + "phone_code": "261" }, { "code": "MW", - "name": "Malawi" + "name": "Malawi", + "phone_code": "265" }, { "code": "MY", - "name": "Malaysia" + "name": "Malaysia", + "phone_code": "60" }, { "code": "MV", - "name": "Maldives" + "name": "Maldives", + "phone_code": "960" }, { "code": "ML", - "name": "Mali" + "name": "Mali", + "phone_code": "223" }, { "code": "MT", - "name": "Malta" + "name": "Malta", + "phone_code": "356" }, { "code": "MH", - "name": "Marshall Islands" + "name": "Marshall Islands", + "phone_code": "692" }, { "code": "MQ", - "name": "Martinique" + "name": "Martinique", + "phone_code": "596" }, { "code": "MR", - "name": "Mauritania" + "name": "Mauritania", + "phone_code": "222" }, { "code": "MU", - "name": "Mauritius" + "name": "Mauritius", + "phone_code": "230" }, { "code": "YT", - "name": "Mayotte" + "name": "Mayotte", + "phone_code": "262" }, { "code": "MX", - "name": "Mexico" + "name": "Mexico", + "phone_code": "52" }, { "code": "FM", - "name": "Micronesia" + "name": "Micronesia", + "phone_code": "691" }, { "code": "MD", - "name": "Moldova" + "name": "Moldova", + "phone_code": "373" }, { "code": "MC", - "name": "Monaco" + "name": "Monaco", + "phone_code": "377" }, { "code": "MN", - "name": "Mongolia" + "name": "Mongolia", + "phone_code": "976" }, { "code": "ME", - "name": "Montenegro" + "name": "Montenegro", + "phone_code": "382" }, { "code": "MS", - "name": "Montserrat" + "name": "Montserrat", + "phone_code": "1-664" }, { "code": "MA", - "name": "Morocco" + "name": "Morocco", + "phone_code": "212" }, { "code": "MZ", - "name": "Mozambique" + "name": "Mozambique", + "phone_code": "258" }, { "code": "MM", - "name": "Myanmar" + "name": "Myanmar", + "phone_code": "95" }, { "code": "NA", - "name": "Namibia" + "name": "Namibia", + "phone_code": "264" }, { "code": "NR", - "name": "Nauru" + "name": "Nauru", + "phone_code": "674" }, { "code": "NP", - "name": "Nepal" + "name": "Nepal", + "phone_code": "977" }, { "code": "NL", - "name": "Netherlands" + "name": "Netherlands", + "phone_code": "31" }, { "code": "NC", - "name": "New Caledonia" + "name": "New Caledonia", + "phone_code": "687" }, { "code": "NZ", - "name": "New Zealand" + "name": "New Zealand", + "phone_code": "64" }, { "code": "NI", - "name": "Nicaragua" + "name": "Nicaragua", + "phone_code": "505" }, { "code": "NE", - "name": "Niger" + "name": "Niger", + "phone_code": "227" }, { "code": "NG", - "name": "Nigeria" + "name": "Nigeria", + "phone_code": "234" }, { "code": "NU", - "name": "Niue" + "name": "Niue", + "phone_code": "683" }, { "code": "NF", - "name": "Norfolk Island" + "name": "Norfolk Island", + "phone_code": "672" }, { "code": "KP", - "name": "North Korea" + "name": "North Korea", + "phone_code": "850" }, { "code": "MP", - "name": "Northern Mariana Islands" + "name": "Northern Mariana Islands", + "phone_code": "1-670" }, { "code": "NO", - "name": "Norway" + "name": "Norway", + "phone_code": "47" }, { "code": "OM", - "name": "Oman" + "name": "Oman", + "phone_code": "968" }, { "code": "PK", - "name": "Pakistan" + "name": "Pakistan", + "phone_code": "92" }, { "code": "PW", - "name": "Palau" + "name": "Palau", + "phone_code": "680" }, { "code": "PS", - "name": "Palestinian Territory" + "name": "Palestinian Territory", + "phone_code": "970" }, { "code": "PA", - "name": "Panama" + "name": "Panama", + "phone_code": "507" }, { "code": "PG", - "name": "Papua New Guinea" + "name": "Papua New Guinea", + "phone_code": "675" }, { "code": "PY", - "name": "Paraguay" + "name": "Paraguay", + "phone_code": "595" }, { "code": "PE", - "name": "Peru" + "name": "Peru", + "phone_code": "51" }, { "code": "PH", - "name": "Philippines" + "name": "Philippines", + "phone_code": "63" }, { "code": "PN", - "name": "Pitcairn" + "name": "Pitcairn", + "phone_code": "870" }, { "code": "PL", - "name": "Poland" + "name": "Poland", + "phone_code": "48" }, { "code": "PT", - "name": "Portugal" + "name": "Portugal", + "phone_code": "351" }, { "code": "PR", - "name": "Puerto Rico" + "name": "Puerto Rico", + "phone_code": "1-787 and 1-939" }, { "code": "QA", - "name": "Qatar" + "name": "Qatar", + "phone_code": "974" }, { "code": "CG", - "name": "Republic of the Congo" + "name": "Republic of the Congo", + "phone_code": "242" }, { "code": "RE", - "name": "Reunion" + "name": "Reunion", + "phone_code": "262" }, { "code": "RO", - "name": "Romania" + "name": "Romania", + "phone_code": "40" }, { "code": "RU", - "name": "Russia" + "name": "Russia", + "phone_code": "7" }, { "code": "RW", - "name": "Rwanda" + "name": "Rwanda", + "phone_code": "250" }, { "code": "BL", - "name": "Saint Barthelemy" + "name": "Saint Barthelemy", + "phone_code": "590" }, { "code": "SH", - "name": "Saint Helena" + "name": "Saint Helena", + "phone_code": "290" }, { "code": "KN", - "name": "Saint Kitts and Nevis" + "name": "Saint Kitts and Nevis", + "phone_code": "1-869" }, { "code": "LC", - "name": "Saint Lucia" + "name": "Saint Lucia", + "phone_code": "1-758" }, { "code": "MF", - "name": "Saint Martin" + "name": "Saint Martin", + "phone_code": "590" }, { "code": "PM", - "name": "Saint Pierre and Miquelon" + "name": "Saint Pierre and Miquelon", + "phone_code": "508" }, { "code": "VC", - "name": "Saint Vincent and the Grenadines" + "name": "Saint Vincent and the Grenadines", + "phone_code": "1-784" }, { "code": "WS", - "name": "Samoa" + "name": "Samoa", + "phone_code": "685" }, { "code": "SM", - "name": "San Marino" + "name": "San Marino", + "phone_code": "378" }, { "code": "ST", - "name": "Sao Tome and Principe" + "name": "Sao Tome and Principe", + "phone_code": "239" }, { "code": "SA", - "name": "Saudi Arabia" + "name": "Saudi Arabia", + "phone_code": "966" }, { "code": "SN", - "name": "Senegal" + "name": "Senegal", + "phone_code": "221" }, { "code": "RS", - "name": "Serbia" + "name": "Serbia", + "phone_code": "381" }, { "code": "SC", - "name": "Seychelles" + "name": "Seychelles", + "phone_code": "248" }, { "code": "SL", - "name": "Sierra Leone" + "name": "Sierra Leone", + "phone_code": "232" }, { "code": "SG", - "name": "Singapore" + "name": "Singapore", + "phone_code": "65" }, { "code": "SX", - "name": "Sint Maarten" + "name": "Sint Maarten", + "phone_code": "599" }, { "code": "SK", - "name": "Slovakia" + "name": "Slovakia", + "phone_code": "421" }, { "code": "SI", - "name": "Slovenia" + "name": "Slovenia", + "phone_code": "386" }, { "code": "SB", - "name": "Solomon Islands" + "name": "Solomon Islands", + "phone_code": "677" }, { "code": "SO", - "name": "Somalia" + "name": "Somalia", + "phone_code": "252" }, { "code": "ZA", - "name": "South Africa" + "name": "South Africa", + "phone_code": "27" }, { "code": "GS", - "name": "South Georgia and the South Sandwich Islands" + "name": "South Georgia and the South Sandwich Islands", + "phone_code": "" }, { "code": "KR", - "name": "South Korea" + "name": "South Korea", + "phone_code": "82" }, { "code": "SS", - "name": "South Sudan" + "name": "South Sudan", + "phone_code": "211" }, { "code": "ES", - "name": "Spain" + "name": "Spain", + "phone_code": "34" }, { "code": "LK", - "name": "Sri Lanka" + "name": "Sri Lanka", + "phone_code": "94" }, { "code": "SD", - "name": "Sudan" + "name": "Sudan", + "phone_code": "249" }, { "code": "SR", - "name": "Suriname" + "name": "Suriname", + "phone_code": "597" }, { "code": "SJ", - "name": "Svalbard and Jan Mayen" + "name": "Svalbard and Jan Mayen", + "phone_code": "47" }, { "code": "SZ", - "name": "Swaziland" + "name": "Swaziland", + "phone_code": "268" }, { "code": "SE", - "name": "Sweden" + "name": "Sweden", + "phone_code": "46" }, { "code": "CH", - "name": "Switzerland" + "name": "Switzerland", + "phone_code": "41" }, { "code": "SY", - "name": "Syria" + "name": "Syria", + "phone_code": "963" }, { "code": "TW", - "name": "Taiwan" + "name": "Taiwan", + "phone_code": "886" }, { "code": "TJ", - "name": "Tajikistan" + "name": "Tajikistan", + "phone_code": "992" }, { "code": "TZ", - "name": "Tanzania" + "name": "Tanzania", + "phone_code": "255" }, { "code": "TH", - "name": "Thailand" + "name": "Thailand", + "phone_code": "66" }, { "code": "TG", - "name": "Togo" + "name": "Togo", + "phone_code": "228" }, { "code": "TK", - "name": "Tokelau" + "name": "Tokelau", + "phone_code": "690" }, { "code": "TO", - "name": "Tonga" + "name": "Tonga", + "phone_code": "676" }, { "code": "TT", - "name": "Trinidad and Tobago" + "name": "Trinidad and Tobago", + "phone_code": "1-868" }, { "code": "TN", - "name": "Tunisia" + "name": "Tunisia", + "phone_code": "216" }, { "code": "TR", - "name": "Turkey" + "name": "Turkey", + "phone_code": "90" }, { "code": "TM", - "name": "Turkmenistan" + "name": "Turkmenistan", + "phone_code": "993" }, { "code": "TC", - "name": "Turks and Caicos Islands" + "name": "Turks and Caicos Islands", + "phone_code": "1-649" }, { "code": "TV", - "name": "Tuvalu" + "name": "Tuvalu", + "phone_code": "688" }, { "code": "VI", - "name": "U.S. Virgin Islands" + "name": "U.S. Virgin Islands", + "phone_code": "1-340" }, { "code": "UG", - "name": "Uganda" + "name": "Uganda", + "phone_code": "256" }, { "code": "UA", - "name": "Ukraine" + "name": "Ukraine", + "phone_code": "380" }, { "code": "AE", - "name": "United Arab Emirates" + "name": "United Arab Emirates", + "phone_code": "971" }, { "code": "GB", - "name": "United Kingdom" + "name": "United Kingdom", + "phone_code": "44" }, { "code": "US", - "name": "United States" + "name": "United States", + "phone_code": "1" }, { "code": "UM", - "name": "United States Minor Outlying Islands" + "name": "United States Minor Outlying Islands", + "phone_code": "1" }, { "code": "UY", - "name": "Uruguay" + "name": "Uruguay", + "phone_code": "598" }, { "code": "UZ", - "name": "Uzbekistan" + "name": "Uzbekistan", + "phone_code": "998" }, { "code": "VU", - "name": "Vanuatu" + "name": "Vanuatu", + "phone_code": "678" }, { "code": "VA", - "name": "Vatican" + "name": "Vatican", + "phone_code": "379" }, { "code": "VE", - "name": "Venezuela" + "name": "Venezuela", + "phone_code": "58" }, { "code": "VN", - "name": "Vietnam" + "name": "Vietnam", + "phone_code": "84" }, { "code": "WF", - "name": "Wallis and Futuna" + "name": "Wallis and Futuna", + "phone_code": "681" }, { "code": "EH", - "name": "Western Sahara" + "name": "Western Sahara", + "phone_code": "212" }, { "code": "YE", - "name": "Yemen" + "name": "Yemen", + "phone_code": "967" }, { "code": "ZM", - "name": "Zambia" + "name": "Zambia", + "phone_code": "260" }, { "code": "ZW", - "name": "Zimbabwe" + "name": "Zimbabwe", + "phone_code": "263" } ] diff --git a/apps/www/data/Footer.json b/apps/www/data/Footer.json index cd224f9b182..bc567325dd5 100644 --- a/apps/www/data/Footer.json +++ b/apps/www/data/Footer.json @@ -62,6 +62,10 @@ { "text": "DPA", "url": "/legal/dpa" + }, + { + "text": "SOC2", + "url": "/legal/soc2" } ] }, diff --git a/apps/www/pages/legal/dpa.tsx b/apps/www/pages/legal/dpa.tsx index b155a771445..ad9ecd2b3d4 100644 --- a/apps/www/pages/legal/dpa.tsx +++ b/apps/www/pages/legal/dpa.tsx @@ -1,10 +1,40 @@ -import { Button } from '@supabase/ui' -import CTABanner from 'components/CTABanner/index' +import * as Yup from 'yup' import Link from 'next/link' +import { useState } from 'react' +import { Button, Form, IconDownload, Input } from '@supabase/ui' + +import supabase from '~/lib/supabase' +import CTABanner from 'components/CTABanner/index' import Layout from '~/components/Layouts/Default' import SectionContainer from '~/components/Layouts/SectionContainer' const DPA = () => { + const [email, setEmail] = useState('') + const [error, setError] = useState() + const [formSubmitted, setFormSubmitted] = useState(false) + + const INITIAL_VALUES = { email: '' } + + const FormSchema = Yup.object().shape({ + email: Yup.string().email('Invalid email').required('Required'), + }) + + const handleFormSubmit = async (values: typeof INITIAL_VALUES, { resetForm }: any) => { + try { + setError(undefined) + const { error } = await supabase + .from('dpa_downloads') + .insert([{ contact_email: values.email, document: 'dpa' }]) + + if (error) throw error + + resetForm() + setFormSubmitted(true) + window.open('https://supabase.com/downloads/docs/Supabase+DPA+220503.pdf', '_blank') + } catch (error: any) { + setError(error.message) + } + } return ( <> @@ -19,14 +49,52 @@ const DPA = () => { ("DPA").

-

You can download the latest DPA document through our security portal.

-
- - - -
+

+ You can download the latest DPA document through our{' '} + security portal, or by + submitting your email here. +

+ + {formSubmitted ? ( +

+ Thank you for your submission! A new tab should have opened with the DPA + document +

+ ) : ( +
+ {({ isSubmitting }: any) => ( + <> + setEmail(e.target.value)} + type="email" + name="email" + id="email" + required + descriptionText="We only keep a record of your email so we can update you when the document has been updated." + placeholder="Your email address" + error={error} + actions={ + + } + /> + {error &&

{error}

} + + )} +
+ )}
@@ -36,5 +104,4 @@ const DPA = () => { ) } - export default DPA diff --git a/apps/www/pages/legal/soc2.tsx b/apps/www/pages/legal/soc2.tsx new file mode 100644 index 00000000000..c58ebe4dfef --- /dev/null +++ b/apps/www/pages/legal/soc2.tsx @@ -0,0 +1,36 @@ +import Link from 'next/link' +import CTABanner from 'components/CTABanner/index' +import Layout from '~/components/Layouts/Default' +import SectionContainer from '~/components/Layouts/SectionContainer' +import SOC2RequestForm from '~/components/SOC2RequestForm' + +const SOC2 = () => { + return ( + + +
+
+
+

SOC2

+

+ As a database company, being SOC2 compliant is important when handling sensitive + customer data. Supabase is currently SOC2 Type 1 compliant and we're also working on + getting certified for SOC2 Type 2 and HIPAA next. +

+ +

+ You can request for our latest SOC 2 document either through our{' '} + security portal, or by submitting + your request here. +

+ + +
+
+
+
+ +
+ ) +} +export default SOC2 diff --git a/apps/www/public/downloads/docs/Supabase+DPA+220503.pdf b/apps/www/public/downloads/docs/Supabase+DPA+220503.pdf new file mode 100644 index 00000000000..5f2492f04a1 Binary files /dev/null and b/apps/www/public/downloads/docs/Supabase+DPA+220503.pdf differ diff --git a/apps/www/supabase/functions/hubspot-notification/index.ts b/apps/www/supabase/functions/hubspot-notification/index.ts index 00fd315ed26..7cb06314695 100644 --- a/apps/www/supabase/functions/hubspot-notification/index.ts +++ b/apps/www/supabase/functions/hubspot-notification/index.ts @@ -4,6 +4,8 @@ const FUNCTION_SECRET = Deno.env.get('FUNCTION_SECRET') const HUBSPOT_PORTAL = Deno.env.get('HUBSPOT_PORTAL') const PARTNER_FORM_ID = Deno.env.get('PARTNER_FORM_ID') const ENTERPRISE_FORM_ID = Deno.env.get('ENTERPRISE_FORM_ID') +const DPA_FORM_ID = Deno.env.get('DPA_FORM_ID') +const SOC2_FORM_ID = Deno.env.get('SOC2_FORM_ID') serve(async (req) => { const requestSecret = req.headers.get('x-function-secret') @@ -27,25 +29,32 @@ serve(async (req) => { const website = input.record.website const partner_gallery_type = input.record.type - let formData: object = { - supabase_table_id, - country, - form_note, - company, - company_size, - email, - phone, - lastName, - firstName, - } + let formData: object = { email } - if (input.table === 'partner_contacts') { - formData = { - ...formData, - jobtitle, - website, - partner_gallery_type, - } + switch (input.table) { + case 'partner_contacts': + formData = { ...formData, jobtitle, website, partner_gallery_type } + break + case 'soc2_requests': + case 'enterprise_contacts': + formData = { + ...formData, + supabase_table_id, + country, + form_note, + company, + company_size, + email, + phone, + lastName, + firstName, + } + break + case 'dpa_downloads': + formData = { ...formData } + break + default: + break } const fields: { objectTypeId: '0-1'; name: string; value: string }[] = [] @@ -53,7 +62,14 @@ serve(async (req) => { fields.push({ objectTypeId: '0-1', name: key, value: value || 'NOT_PROVIDED' }) } - const formId = input.table === 'partner_contacts' ? PARTNER_FORM_ID : ENTERPRISE_FORM_ID + const formId = + input.table === 'partner_contacts' + ? PARTNER_FORM_ID + : input.table === 'dpa_downloads' + ? DPA_FORM_ID + : input.table === 'soc2_requests' + ? SOC2_FORM_ID + : ENTERPRISE_FORM_ID // Using HubSpot's submit data to a form API // https://legacydocs.hubspot.com/docs/methods/forms/submit_form