diff --git a/webapp/package-lock.json b/webapp/package-lock.json
index 6630492..fd8df01 100644
--- a/webapp/package-lock.json
+++ b/webapp/package-lock.json
@@ -17,6 +17,7 @@
"pinia": "^2.3.0",
"vue": "^3.4.29",
"vue-router": "^4.3.3",
+ "vue-turnstile": "^1.0.11",
"vuetify": "^3.7.2"
},
"devDependencies": {
@@ -2181,6 +2182,15 @@
"typescript": ">=5.0.0"
}
},
+ "node_modules/vue-turnstile": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/vue-turnstile/-/vue-turnstile-1.0.11.tgz",
+ "integrity": "sha512-iaTBoZ5oUqtNRto6bmbn6FQvW0h/sK7mPUJc1Qn4em+cELXN59U2FQTcpWfKssV3OY6lEZzmCpcn/zrb7htK3A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "vue": "^3.2.45"
+ }
+ },
"node_modules/vuetify": {
"version": "3.11.2",
"resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.11.2.tgz",
diff --git a/webapp/package.json b/webapp/package.json
index a917be8..9013819 100644
--- a/webapp/package.json
+++ b/webapp/package.json
@@ -21,6 +21,7 @@
"pinia": "^2.3.0",
"vue": "^3.4.29",
"vue-router": "^4.3.3",
+ "vue-turnstile": "^1.0.11",
"vuetify": "^3.7.2"
},
"devDependencies": {
diff --git a/webapp/src/services/apiService.ts b/webapp/src/services/apiService.ts
index c46e0f0..2d0247e 100644
--- a/webapp/src/services/apiService.ts
+++ b/webapp/src/services/apiService.ts
@@ -87,3 +87,17 @@ export const geocodeQuery = async (query: string) => {
const result = (await apiService.get(`/geocode?query=${encodedQuery}`)).data;
return result;
}
+
+export interface ContactMessagePayload {
+ name: string;
+ email: string;
+ topic: string;
+ subject: string;
+ message: string;
+ turnstileToken: string;
+}
+
+export const postContactMessage = async (payload: ContactMessagePayload) => {
+ const response = await apiService.post("/contact/message", payload);
+ return response.data;
+}
diff --git a/webapp/src/views/ContactView.vue b/webapp/src/views/ContactView.vue
index 677be62..6c82567 100644
--- a/webapp/src/views/ContactView.vue
+++ b/webapp/src/views/ContactView.vue
@@ -1,161 +1,256 @@
-
- How can we help you today?
-
+ We'd love to hear from you.
+
+ Please complete the security check.
+ Send us an email at:
- Media inquiries? Visit our
-
- Need to identify if something is an ALPR camera?
+ If you prefer, you can also email us directly at
+ contact@deflock.org.
+ Contact Us
- Contact Us
+
- Other Ways to Reach Us
+
- For media inquiries and interview requests, send us an email at media@deflock.org.
+ For media inquiries and interview requests, send us an email