mirror of
https://github.com/geoffsee/open-gsio.git
synced 2025-09-08 22:56:46 +00:00
init
This commit is contained in:
90
src/stores/ClientFeedbackStore.ts
Normal file
90
src/stores/ClientFeedbackStore.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
import { types, flow } from "mobx-state-tree";
|
||||
|
||||
const ClientFeedbackStore = types
|
||||
.model("ClientFeedbackStore", {
|
||||
input: types.optional(types.string, ""),
|
||||
isLoading: types.optional(types.boolean, false),
|
||||
isSubmitted: types.optional(types.boolean, false),
|
||||
error: types.optional(types.string, ""),
|
||||
})
|
||||
.actions((self) => {
|
||||
const setError = (error) => {
|
||||
self.error = error;
|
||||
};
|
||||
|
||||
const setInput = (value) => {
|
||||
self.input = value;
|
||||
|
||||
if (self.error) {
|
||||
setError("");
|
||||
}
|
||||
};
|
||||
|
||||
const reset = () => {
|
||||
self.input = "";
|
||||
self.isLoading = false;
|
||||
self.isSubmitted = false;
|
||||
self.error = "";
|
||||
};
|
||||
|
||||
const validateInput = () => {
|
||||
if (!self.input.trim()) {
|
||||
setError("Feedback cannot be empty.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (self.input.length > 500) {
|
||||
setError("Feedback cannot exceed 500 characters.");
|
||||
return false;
|
||||
}
|
||||
|
||||
setError("");
|
||||
return true;
|
||||
};
|
||||
|
||||
const submitFeedback = flow(function* () {
|
||||
if (!validateInput()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
self.isLoading = true;
|
||||
|
||||
try {
|
||||
const response = yield fetch("/api/feedback", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({ feedback: self.input }),
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Error: ${response.status} - ${response.statusText}`);
|
||||
}
|
||||
|
||||
self.isSubmitted = true;
|
||||
self.input = "";
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
setError(
|
||||
error.message || "An error occurred while submitting feedback.",
|
||||
);
|
||||
return false;
|
||||
} finally {
|
||||
self.isLoading = false;
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
setInput,
|
||||
setError,
|
||||
reset,
|
||||
validateInput,
|
||||
submitFeedback,
|
||||
};
|
||||
});
|
||||
|
||||
const feedbackStore = ClientFeedbackStore.create();
|
||||
|
||||
export default feedbackStore;
|
Reference in New Issue
Block a user