diff --git a/app/package.json b/app/package.json
index 6925f15..e689a4d 100644
--- a/app/package.json
+++ b/app/package.json
@@ -10,6 +10,7 @@
"preview": "vite preview"
},
"dependencies": {
+ "@formbricks/js": "^2.1.1",
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0",
diff --git a/app/src/components/game/CompleteModal.vue b/app/src/components/game/CompleteModal.vue
index 6a6b5a8..996928b 100644
--- a/app/src/components/game/CompleteModal.vue
+++ b/app/src/components/game/CompleteModal.vue
@@ -9,9 +9,11 @@ import CompleteAnimation from '../../img/complete-animation.json'
const showModal = ref(true) // Controls whether the modal is visible or not
const router = useRouter()
const toast = useToast()
+
const closeModal = () => {
showModal.value = false
}
+
const defineComponent = () => ({
components: {
Vue3Lottie,
@@ -22,6 +24,7 @@ const defineComponent = () => ({
}
},
})
+
const backtoMap = async () => {
try {
router.push({ name: 'map' })
@@ -67,6 +70,21 @@ setTimeout(() => {
>回到地圖
+
+
+
diff --git a/app/src/components/game/ControlPalette.vue b/app/src/components/game/ControlPalette.vue
index b423112..8d82084 100644
--- a/app/src/components/game/ControlPalette.vue
+++ b/app/src/components/game/ControlPalette.vue
@@ -2,7 +2,7 @@
import { useRouter } from 'vue-router'
import { useToast } from 'vue-toastification'
import useSession from '../../store/session'
-import { surveyUrl } from '../../config'
+import { openBugReport, openQuestSurvey } from '../../utils/formbricks'
const router = useRouter()
const sessionStore = useSession()
@@ -21,31 +21,39 @@ const continuePlay = async () => {
-
-
diff --git a/app/src/components/header/GameHeaderComponents.vue b/app/src/components/header/GameHeaderComponents.vue
index ef9a685..3789c10 100644
--- a/app/src/components/header/GameHeaderComponents.vue
+++ b/app/src/components/header/GameHeaderComponents.vue
@@ -3,7 +3,8 @@ import { onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { useToast } from 'vue-toastification'
import { logout } from '../../utils/auth'
-import { bugReportUrl, surveyUrl } from '../../config'
+import { surveyUrl } from '../../config'
+import { openBugReport } from '../../utils/formbricks'
import useSession from '../../store/session'
import useUserProfile from '../../store/userProfile'
@@ -84,15 +85,14 @@ onMounted(async () => {
Map
-
Bug Report
-
+
{
+ if (typeof formbricks !== 'undefined') {
+ formbricks.registerRouteChange()
+ }
+})
+
const options = {
position: POSITION.TOP_RIGHT,
}
diff --git a/app/src/store/session.ts b/app/src/store/session.ts
index 5845ea8..d6ced19 100644
--- a/app/src/store/session.ts
+++ b/app/src/store/session.ts
@@ -61,8 +61,15 @@ const useSession = defineStore('session', {
if (response.tasks) {
this.session.tasks = response.tasks
}
+ if (
+ response.status === 'finished' &&
+ this.session.status !== 'finished'
+ ) {
+ this.finish()
+ }
this.session.status = response.status
},
+ finish() {},
reset() {
socket.reset()
term.reset()
diff --git a/app/src/utils/formbricks.ts b/app/src/utils/formbricks.ts
new file mode 100644
index 0000000..761a489
--- /dev/null
+++ b/app/src/utils/formbricks.ts
@@ -0,0 +1,40 @@
+import formbricks from '@formbricks/js/website'
+import useSession from '../store/session'
+import useUserProfile from '../store/userProfile'
+
+if (typeof window !== 'undefined') {
+ formbricks.init({
+ environmentId: 'clzcdqqn0000kadvtqykdo0pc',
+ apiHost: 'https://app.formbricks.com',
+ })
+}
+
+export function openQuestSurvey() {
+ const sessionStore = useSession()
+ const userStore = useUserProfile()
+
+ formbricks.track('quest_completed', {
+ hiddenFields: {
+ quest: sessionStore.questId,
+ session: sessionStore.session?._id,
+ username: userStore.username,
+ email: userStore.email,
+ },
+ })
+}
+
+export function openBugReport() {
+ const sessionStore = useSession()
+ const userStore = useUserProfile()
+
+ formbricks.track('bug_report', {
+ hiddenFields: {
+ quest: sessionStore.questId,
+ session: sessionStore.session?._id,
+ username: userStore.username,
+ email: userStore.email,
+ },
+ })
+}
+
+export default formbricks
diff --git a/app/src/views/GamePage.vue b/app/src/views/GamePage.vue
index e7c5c89..ad7cc2b 100644
--- a/app/src/views/GamePage.vue
+++ b/app/src/views/GamePage.vue
@@ -1,6 +1,7 @@