@live-change/user-frontend 0.9.185 → 0.9.187

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -218,6 +218,30 @@
218
218
  "subject": "Confirm your email address.",
219
219
  "description": "You are trying to reset password to your account. In order to confirm that, please enter secret code:",
220
220
  "textDescription": "You are trying to reset password to your account. In order to confirm that, please enter secret code:"
221
+ },
222
+ "feedbackReceived": {
223
+ "subject": {
224
+ "feedback": "New feedback received",
225
+ "error": "Error report received",
226
+ "delete": "Feedback after account deletion received"
227
+ },
228
+ "description": "You have received {type} from a user.",
229
+ "textDescription": "You have received {type} from a user.",
230
+ "contentLabel": "Content",
231
+ "contactLabel": "Contact Information",
232
+ "userProvidedEmailLabel": "User provided email",
233
+ "userContactLabel": "User contact",
234
+ "detailsLabel": "Details",
235
+ "typeLabel": "Type",
236
+ "ipLabel": "IP Address",
237
+ "sessionLabel": "Session",
238
+ "userAgentLabel": "User Agent",
239
+ "traceLabel": "Trace",
240
+ "types": {
241
+ "feedback": "feedback",
242
+ "error": "error report",
243
+ "delete": "feedback after account deletion"
244
+ }
221
245
  }
222
246
  },
223
247
  "smsTemplates": {
@@ -218,6 +218,30 @@
218
218
  "subject": "Potwierdź swój adres email.",
219
219
  "description": "Próbujesz zresetować hasło do swojego konta. Aby to potwierdzić, wprowadź tajny kod:",
220
220
  "textDescription": "Próbujesz zresetować hasło do swojego konta. Aby to potwierdzić, wprowadź tajny kod:"
221
+ },
222
+ "feedbackReceived": {
223
+ "subject": {
224
+ "feedback": "Otrzymano nowy feedback",
225
+ "error": "Otrzymano zgłoszenie błędu",
226
+ "delete": "Otrzymano feedback po usunięciu konta"
227
+ },
228
+ "description": "Otrzymałeś {type} od użytkownika.",
229
+ "textDescription": "Otrzymałeś {type} od użytkownika.",
230
+ "contentLabel": "Treść",
231
+ "contactLabel": "Informacje kontaktowe",
232
+ "userProvidedEmailLabel": "Email podany przez użytkownika",
233
+ "userContactLabel": "Kontakt użytkownika",
234
+ "detailsLabel": "Szczegóły",
235
+ "typeLabel": "Typ",
236
+ "ipLabel": "Adres IP",
237
+ "sessionLabel": "Sesja",
238
+ "userAgentLabel": "User Agent",
239
+ "traceLabel": "Trace",
240
+ "types": {
241
+ "feedback": "feedback",
242
+ "error": "zgłoszenie błędu",
243
+ "delete": "feedback po usunięciu konta"
244
+ }
221
245
  }
222
246
  },
223
247
  "smsTemplates": {
@@ -1,33 +1,64 @@
1
1
  <template>
2
- <div class="w-full lg:w-6/12 md:w-9/12 max-w-[32rem]" v-shared-element:form="{ duration: '300ms', includeChildren: true }">
2
+ <div class="w-full lg:w-6/12 md:w-9/12 max-w-[32rem]"
3
+ v-shared-element:form="{ duration: '300ms', includeChildren: true }">
3
4
  <div class="bg-surface-0 dark:bg-surface-900 p-6 shadow rounded-border">
4
5
  <div class="text-center mb-8">
5
- <div class="text-surface-900 dark:text-surface-0 text-3xl font-medium mb-4">{{ t('deleteAccount.accountDeleted') }}</div>
6
+ <div class="text-surface-900 dark:text-surface-0 text-3xl font-medium mb-4">
7
+ {{ t('deleteAccount.accountDeleted') }}
8
+ </div>
6
9
  </div>
7
10
 
8
11
  <div class="mb-4">
9
12
  {{ t('deleteAccount.feedbackRequest') }}
10
13
  </div>
14
+ <command-form v-if="isMounted" service="feedback" action="leaveFeedback" v-slot="{ data }"
15
+ :parameters="{ type: 'delete', userAgent: ua }"
16
+ @done="handleDone">
11
17
 
12
- <Textarea class="w-full" :autoResize="true" rows="4" cols="30" />
13
- <div class="flex flex-row items-end">
14
- <Button :label="t('deleteAccount.send')" icon="pi pi-send" class="ml-auto p-button-lg"></Button>
15
- </div>
18
+ <Textarea v-model="data.content" class="w-full" :autoResize="true" rows="4" cols="30" :error="data.contentError" />
19
+ <small v-if="data.contentError" class="text-red-500 dark:text-red-400">
20
+ {{ t(`errors.${data.contentError}`) }}
21
+ </small>
22
+
23
+ <div class="flex flex-row items-end">
24
+ <Button type="submit" :label="t('deleteAccount.send')" icon="pi pi-send" class="ml-auto p-button-lg" />
25
+ </div>
26
+ </command-form>
16
27
 
17
28
  </div>
18
29
  </div>
19
30
  </template>
20
31
 
21
32
  <script setup>
22
- import InputText from "primevue/inputtext"
23
- import Checkbox from "primevue/checkbox"
24
33
  import Button from "primevue/button"
25
- import Divider from "primevue/divider"
26
34
  import Textarea from "primevue/textarea"
27
35
 
28
36
  import { useI18n } from 'vue-i18n'
29
37
  const { t } = useI18n()
30
38
 
39
+ import { onMounted, ref } from "vue"
40
+ const isMounted = ref(false)
41
+ onMounted(() => isMounted.value = true)
42
+
43
+ import { useToast } from 'primevue/usetoast'
44
+ const toast = useToast()
45
+
46
+ const ua = ref()
47
+ onMounted(() => {
48
+ ua.value = navigator.userAgent
49
+ })
50
+
51
+ function handleDone({ parameters, result }) {
52
+ console.log("DONE PARAMETERS", parameters)
53
+ console.log("DONE RESULT", result)
54
+ toast.add({
55
+ severity: 'info', life: 6000,
56
+ summary: t('deleteAccount.feedbackSent'),
57
+ detail: t('deleteAccount.thankYou')
58
+ })
59
+ router.push({ name: 'user:deleteFeedbackSent' })
60
+ }
61
+
31
62
  </script>
32
63
 
33
64
  <style>
@@ -0,0 +1,151 @@
1
+ <template>
2
+ <pre data-headers>{{ JSON.stringify(metadata, null, ' ') }}</pre>
3
+ <div data-html class="message m-12">
4
+ <p class="text-lg">
5
+ {{ t('emailTemplates.hello') }}
6
+ </p>
7
+ <p>
8
+ {{ t('emailTemplates.feedbackReceived.description', { type: t(`emailTemplates.feedbackReceived.types.${feedbackType}`) }) }}
9
+ </p>
10
+ <div class="feedback-content">
11
+ <p class="font-medium">{{ t('emailTemplates.feedbackReceived.contentLabel') }}: </p>
12
+ <p class="bg-gray-100 p-4 rounded">{{ data.content }}</p>
13
+ </div>
14
+ <div v-if="data.email || userEmails.length > 0" class="feedback-contact mt-4">
15
+ <p class="font-medium">{{ t('emailTemplates.feedbackReceived.contactLabel') }}: </p>
16
+ <ul class="list-none pl-0">
17
+ <li v-if="data.email">
18
+ <strong>{{ t('emailTemplates.feedbackReceived.userProvidedEmailLabel') }}: </strong>
19
+ <a :href="'mailto:' + data.email">{{ data.email }}</a>
20
+ </li>
21
+ <li v-for="contact in userEmails" :key="contact.email">
22
+ <strong>{{ t('emailTemplates.feedbackReceived.userContactLabel') }}: </strong>
23
+ <a :href="'mailto:' + contact.email">{{ contact.email }}</a>
24
+ </li>
25
+ </ul>
26
+ </div>
27
+ <div class="feedback-details mt-4">
28
+ <p class="font-medium">{{ t('emailTemplates.feedbackReceived.detailsLabel') }}:</p>
29
+ <ul class="list-none pl-0">
30
+ <li><strong>{{ t('emailTemplates.feedbackReceived.typeLabel') }}:</strong> {{ t(`emailTemplates.feedbackReceived.types.${feedbackType}`) }}</li>
31
+ <li><strong>{{ t('emailTemplates.feedbackReceived.ipLabel') }}:</strong> {{ data.ip }}</li>
32
+ <li><strong>{{ t('emailTemplates.feedbackReceived.sessionLabel') }}:</strong> {{ data.session }}</li>
33
+ <li><strong>{{ t('emailTemplates.feedbackReceived.userAgentLabel') }}:</strong> {{ data.userAgent }}</li>
34
+ <li v-if="data.trace"><strong>{{ t('emailTemplates.feedbackReceived.traceLabel') }}:</strong> <code style="white-space: pre-wrap; display: block; background: #f5f5f5; padding: 0.5rem; margin-top: 0.5rem;">{{ data.trace }}</code></li>
35
+ </ul>
36
+ </div>
37
+ <p>
38
+ {{ t('emailTemplates.seeYouSoon') }}<br>
39
+ {{ t('emailTemplates.teamSignature', { brandName }) }}
40
+ </p>
41
+ <img src="/images/logo128.png">
42
+ </div>
43
+ <pre class="message" data-text>{{ textVersion }}</pre>
44
+ </template>
45
+
46
+ <script setup>
47
+ const { contact, json } = defineProps({
48
+ contact: {
49
+ type: String,
50
+ required: true
51
+ },
52
+ json: {
53
+ type: String,
54
+ required: true
55
+ }
56
+ })
57
+
58
+ const data = JSON.parse(json)
59
+
60
+ import { useI18n } from 'vue-i18n'
61
+ const { locale: i18nLocale, t } = useI18n()
62
+
63
+ import { useHead } from '@vueuse/head'
64
+ useHead({ htmlAttrs: { class: 'email-rendering' } })
65
+
66
+ import { useApi, live, usePath } from '@live-change/vue3-ssr'
67
+ const api = useApi()
68
+
69
+ const {
70
+ brandName, brandDomain
71
+ } = api.metadata.config.value
72
+
73
+ const feedbackType = data.type || 'feedback'
74
+ const subjectKey = `emailTemplates.feedbackReceived.subject.${feedbackType}`
75
+
76
+ const userEmailsPath = usePath().email.userEmails({ user: data.user })
77
+
78
+ import { useLocale } from "@live-change/vue3-components"
79
+ const locale = useLocale()
80
+ const localePromise = locale.getOtherUserOrSessionLocale(data.user, data.client?.session)
81
+
82
+ const [userEmails, _] = await Promise.all([live(userEmailsPath), localePromise])
83
+ if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
84
+
85
+ console.log('userEmails', userEmails.value)
86
+
87
+ // Determine replyTo - prefer user-provided email, then first user contact
88
+ const replyToEmail = data.email || (userEmails.value.length > 0 ? userEmails.value[0].email : null)
89
+
90
+ const metadata = {
91
+ from: `${brandName} <admin@${brandDomain}>`,
92
+ subject: t(subjectKey),
93
+ to: contact,
94
+ ...(replyToEmail ? { replyTo: replyToEmail } : {})
95
+ }
96
+
97
+ import { computed } from 'vue'
98
+ const textVersion = computed(() => {
99
+ const lines = [
100
+ t('emailTemplates.hello'),
101
+ '',
102
+ t('emailTemplates.feedbackReceived.textDescription', { type: t(`emailTemplates.feedbackReceived.types.${feedbackType}`) }),
103
+ '',
104
+ t('emailTemplates.feedbackReceived.contentLabel') + ':',
105
+ data.content,
106
+ ''
107
+ ]
108
+
109
+ // Add contact information
110
+ if (data.email || userEmails.value.length > 0) {
111
+ lines.push(t('emailTemplates.feedbackReceived.contactLabel') + ':')
112
+ if (data.email) {
113
+ lines.push(t('emailTemplates.feedbackReceived.userProvidedEmailLabel') + ': ' + data.email)
114
+ }
115
+ userEmails.value.forEach(contact => {
116
+ lines.push(t('emailTemplates.feedbackReceived.userContactLabel') + ': ' + contact.email)
117
+ })
118
+ lines.push('')
119
+ }
120
+
121
+ lines.push(
122
+ t('emailTemplates.feedbackReceived.detailsLabel') + ':',
123
+ t('emailTemplates.feedbackReceived.typeLabel') + ': ' + t(`emailTemplates.feedbackReceived.types.${feedbackType}`),
124
+ t('emailTemplates.feedbackReceived.ipLabel') + ': ' + data.ip,
125
+ t('emailTemplates.feedbackReceived.sessionLabel') + ': ' + data.session,
126
+ t('emailTemplates.feedbackReceived.userAgentLabel') + ': ' + data.userAgent
127
+ )
128
+ if (data.trace) {
129
+ lines.push(t('emailTemplates.feedbackReceived.traceLabel') + ': ' + data.trace)
130
+ }
131
+ lines.push('', t('emailTemplates.seeYouSoon'), t('emailTemplates.teamSignature', { brandName }))
132
+ return lines.join('\n')
133
+ })
134
+
135
+ </script>
136
+
137
+ <style scoped>
138
+ img {
139
+ width: 100%;
140
+ max-width: 100px;
141
+ }
142
+ .message {
143
+ font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;
144
+ color: #495057;
145
+ font-weight: 400;
146
+ }
147
+ pre {
148
+ border-top: 1px solid black;
149
+ border-bottom: 1px solid black;
150
+ }
151
+ </style>
@@ -0,0 +1,13 @@
1
+
2
+ export function routes(config = {}) {
3
+ const { prefix = '/', route = (r) => r } = config
4
+
5
+ return [
6
+
7
+ route({ name: 'user:email:feedbackReceived', path: '/_email/feedbackReceived/:contact/:json', props: true,
8
+ meta: { raw: true, lightMode: true }, component: () => import("./email/FeedbackEmail.vue") }),
9
+
10
+ ]
11
+ }
12
+
13
+ export default routes
@@ -71,14 +71,9 @@
71
71
 
72
72
  const secretLink = secrets.find(secret => secret.type === 'link')
73
73
  const secretCode = secrets.find(secret => secret.type === 'code')
74
-
75
- import { useLocale } from "@live-change/vue3-components"
76
- const locale = useLocale()
77
- const localePromise = locale.getOtherUserOrSessionLocale(data.user, data.client?.session)
78
- await Promise.all([localePromise])
74
+
79
75
  import { useI18n } from 'vue-i18n'
80
76
  const { locale: i18nLocale, t } = useI18n()
81
- if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
82
77
 
83
78
  import { useHead } from '@vueuse/head'
84
79
  useHead({ htmlAttrs: { class: 'email-rendering' } })
@@ -107,6 +102,12 @@
107
102
 
108
103
  const code = secretCode.secret.secretCode
109
104
 
105
+ import { useLocale } from "@live-change/vue3-components"
106
+ const locale = useLocale()
107
+ const localePromise = locale.getOtherUserOrSessionLocale(data.user, data.client?.session)
108
+ await Promise.all([localePromise])
109
+ if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
110
+
110
111
  </script>
111
112
 
112
113
  <style scoped>
@@ -72,13 +72,8 @@
72
72
  const secretLink = secrets.find(secret => secret.type === 'link')
73
73
  const secretCode = secrets.find(secret => secret.type === 'code')
74
74
 
75
- import { useLocale } from "@live-change/vue3-components"
76
- const locale = useLocale()
77
- const localePromise = locale.getOtherUserOrSessionLocale(data.user, data.client?.session)
78
- await Promise.all([localePromise])
79
75
  import { useI18n } from 'vue-i18n'
80
76
  const { locale: i18nLocale, t } = useI18n()
81
- if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
82
77
 
83
78
  import { useHead } from '@vueuse/head'
84
79
  useHead({ htmlAttrs: { class: 'email-rendering' } })
@@ -107,6 +102,12 @@
107
102
 
108
103
  const code = secretCode.secret.secretCode
109
104
 
105
+ import { useLocale } from "@live-change/vue3-components"
106
+ const locale = useLocale()
107
+ const localePromise = locale.getOtherUserOrSessionLocale(data.user, data.client?.session)
108
+ await Promise.all([localePromise])
109
+ if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
110
+
110
111
  </script>
111
112
 
112
113
  <style scoped>
@@ -72,13 +72,9 @@
72
72
  const secretLink = secrets.find(secret => secret.type === 'link')
73
73
  const secretCode = secrets.find(secret => secret.type === 'code')
74
74
 
75
- import { useLocale } from "@live-change/vue3-components"
76
- const locale = useLocale()
77
- const localePromise = locale.getOtherUserOrSessionLocale(data.user, data.client?.session)
78
- await Promise.all([localePromise])
75
+
79
76
  import { useI18n } from 'vue-i18n'
80
77
  const { locale: i18nLocale, t } = useI18n()
81
- if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
82
78
 
83
79
  import { useHead } from '@vueuse/head'
84
80
  useHead({ htmlAttrs: { class: 'email-rendering' } })
@@ -107,6 +103,11 @@
107
103
 
108
104
  const code = secretCode.secret.secretCode
109
105
 
106
+ import { useLocale } from "@live-change/vue3-components"
107
+ const locale = useLocale()
108
+ const localePromise = locale.getOtherUserOrSessionLocale(data.user, data.client?.session)
109
+ await Promise.all([localePromise])
110
+ if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
110
111
  </script>
111
112
 
112
113
  <style scoped>
@@ -72,14 +72,8 @@
72
72
  const secretLink = secrets.find(secret => secret.type === 'link')
73
73
  const secretCode = secrets.find(secret => secret.type === 'code')
74
74
 
75
- const owner = { sessionOrUserType: 'session_Session', sessionOrUser: data.session }
76
- import { useLocale } from "@live-change/vue3-components"
77
- const locale = useLocale()
78
- const localePromise = locale.getOtherOwnerLocale(owner)
79
- await Promise.all([localePromise])
80
75
  import { useI18n } from 'vue-i18n'
81
76
  const { locale: i18nLocale, t } = useI18n()
82
- if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
83
77
 
84
78
  import { useHead } from '@vueuse/head'
85
79
  useHead({ htmlAttrs: { class: 'email-rendering' } })
@@ -108,6 +102,13 @@
108
102
 
109
103
  const code = secretCode.secret.secretCode
110
104
 
105
+ const owner = { sessionOrUserType: 'session_Session', sessionOrUser: data.session }
106
+ import { useLocale } from "@live-change/vue3-components"
107
+ const locale = useLocale()
108
+ const localePromise = locale.getOtherOwnerLocale(owner)
109
+ await Promise.all([localePromise])
110
+ if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
111
+
111
112
  </script>
112
113
 
113
114
  <style scoped>
@@ -45,12 +45,6 @@
45
45
  import { useRouter } from 'vue-router'
46
46
  const router = useRouter()
47
47
 
48
- import { useLocale } from "@live-change/vue3-components"
49
- const locale = useLocale()
50
- const localePromise = locale.getOtherUserOrSessionLocale(data.user, data.client?.session)
51
- await Promise.all([localePromise])
52
- if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
53
-
54
48
  const linkAddress = baseHref + router.resolve({
55
49
  name: 'user:link',
56
50
  params: {
@@ -60,6 +54,12 @@
60
54
 
61
55
  const code = secretCode.secret.secretCode
62
56
 
57
+ import { useLocale } from "@live-change/vue3-components"
58
+ const locale = useLocale()
59
+ const localePromise = locale.getOtherUserOrSessionLocale(data.user, data.client?.session)
60
+ await Promise.all([localePromise])
61
+ if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
62
+
63
63
  </script>
64
64
 
65
65
  <style scoped>
@@ -31,12 +31,8 @@
31
31
  const secretCode = secrets.find(secret => secret.type === 'code')
32
32
 
33
33
  import { useLocale } from "@live-change/vue3-components"
34
- const locale = useLocale()
35
- const localePromise = locale.getOtherUserOrSessionLocale(data.user, data.client?.session)
36
- await Promise.all([localePromise])
37
34
  import { useI18n } from 'vue-i18n'
38
35
  const { locale: i18nLocale, t } = useI18n()
39
- if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
40
36
 
41
37
  import { useApi } from '@live-change/vue3-ssr'
42
38
  const api = useApi()
@@ -61,6 +57,12 @@
61
57
 
62
58
  const code = secretCode.secret.secretCode
63
59
 
60
+ import { useLocale } from "@live-change/vue3-components"
61
+ const locale = useLocale()
62
+ const localePromise = locale.getOtherUserOrSessionLocale(data.user, data.client?.session)
63
+ await Promise.all([localePromise])
64
+ if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
65
+
64
66
  </script>
65
67
 
66
68
  <style scoped>
@@ -31,12 +31,8 @@
31
31
  const secretCode = secrets.find(secret => secret.type === 'code')
32
32
 
33
33
  import { useLocale } from "@live-change/vue3-components"
34
- const locale = useLocale()
35
- const localePromise = locale.getOtherUserOrSessionLocale(data.user, data.client?.session)
36
- await Promise.all([localePromise])
37
34
  import { useI18n } from 'vue-i18n'
38
35
  const { locale: i18nLocale, t } = useI18n()
39
- if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
40
36
 
41
37
  import { useApi } from '@live-change/vue3-ssr'
42
38
  const api = useApi()
@@ -61,6 +57,12 @@
61
57
 
62
58
  const code = secretCode.secret.secretCode
63
59
 
60
+ import { useLocale } from "@live-change/vue3-components"
61
+ const locale = useLocale()
62
+ const localePromise = locale.getOtherUserOrSessionLocale(data.user, data.client?.session)
63
+ await Promise.all([localePromise])
64
+ if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
65
+
64
66
  </script>
65
67
 
66
68
  <style scoped>
@@ -30,14 +30,8 @@
30
30
  const secretLink = secrets.find(secret => secret.type === 'link')
31
31
  const secretCode = secrets.find(secret => secret.type === 'code')
32
32
 
33
- const owner = { sessionOrUserType: 'session_Session', sessionOrUser: data.session }
34
- import { useLocale } from "@live-change/vue3-components"
35
- const locale = useLocale()
36
- const localePromise = locale.getOtherOwnerLocale(owner)
37
- await Promise.all([localePromise])
38
33
  import { useI18n } from 'vue-i18n'
39
34
  const { locale: i18nLocale, t } = useI18n()
40
- if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
41
35
 
42
36
  import { useApi } from '@live-change/vue3-ssr'
43
37
  const api = useApi()
@@ -62,6 +56,13 @@
62
56
 
63
57
  const code = secretCode.secret.secretCode
64
58
 
59
+ const owner = { sessionOrUserType: 'session_Session', sessionOrUser: data.session }
60
+ import { useLocale } from "@live-change/vue3-components"
61
+ const locale = useLocale()
62
+ const localePromise = locale.getOtherOwnerLocale(owner)
63
+ await Promise.all([localePromise])
64
+ if(locale.getLanguage()) i18nLocale.value = locale.getLanguage()
65
+
65
66
  </script>
66
67
 
67
68
  <style scoped>
@@ -10,6 +10,7 @@ import connectedRoutes from "./connected/routes.js"
10
10
  import identificationRoutes from "./identification/routes.js"
11
11
  import deleteRoutes from "./delete/routes.js"
12
12
  import googleAccessRoutes from "./google-access/routes.js"
13
+ import feedbackRoutes from "./feedback/routes.js"
13
14
  import { passwordResetRoutes, passwordChangeRoutes } from "./password/routes.js"
14
15
  import { notificationsSettingsRoutes, notificationsRoutes } from "./notifications/routes.js"
15
16
  import localeSettingsRoutes from "./locale/routes.js"
@@ -25,6 +26,7 @@ export function userRoutes(config = {}) {
25
26
  ...passwordResetRoutes(config),
26
27
  ...notificationsRoutes(config),
27
28
  ...googleAccessRoutes(config),
29
+ ...feedbackRoutes(config),
28
30
 
29
31
  route({
30
32
  path: prefix + 'settings', meta: { pageType: 'wide' },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@live-change/user-frontend",
3
- "version": "0.9.185",
3
+ "version": "0.9.187",
4
4
  "scripts": {
5
5
  "memDev": "tsx --inspect --expose-gc server/start.js memDev --enableSessions --initScript ./init.js --dbAccess",
6
6
  "localDevInit": "tsx server/start.js localDev --enableSessions --initScript ./init.js --dbAccess",
@@ -36,29 +36,29 @@
36
36
  },
37
37
  "type": "module",
38
38
  "dependencies": {
39
- "@live-change/cli": "^0.9.185",
40
- "@live-change/dao": "^0.9.185",
41
- "@live-change/dao-vue3": "^0.9.185",
42
- "@live-change/dao-websocket": "^0.9.185",
43
- "@live-change/email-service": "^0.9.185",
44
- "@live-change/framework": "^0.9.185",
45
- "@live-change/identicon-service": "^0.9.185",
46
- "@live-change/image-frontend": "^0.9.185",
47
- "@live-change/message-authentication-service": "^0.9.185",
48
- "@live-change/notification-service": "^0.9.185",
49
- "@live-change/password-authentication-service": "^0.9.185",
50
- "@live-change/pattern": "^0.9.185",
51
- "@live-change/secret-code-service": "^0.9.185",
52
- "@live-change/secret-link-service": "^0.9.185",
53
- "@live-change/security-frontend": "^0.9.185",
54
- "@live-change/security-service": "^0.9.185",
55
- "@live-change/session-service": "^0.9.185",
56
- "@live-change/timer-service": "^0.9.185",
57
- "@live-change/upload-service": "^0.9.185",
58
- "@live-change/user-identification-service": "^0.9.185",
59
- "@live-change/user-service": "^0.9.185",
60
- "@live-change/vue3-components": "^0.9.185",
61
- "@live-change/vue3-ssr": "^0.9.185",
39
+ "@live-change/cli": "^0.9.187",
40
+ "@live-change/dao": "^0.9.187",
41
+ "@live-change/dao-vue3": "^0.9.187",
42
+ "@live-change/dao-websocket": "^0.9.187",
43
+ "@live-change/email-service": "^0.9.187",
44
+ "@live-change/framework": "^0.9.187",
45
+ "@live-change/identicon-service": "^0.9.187",
46
+ "@live-change/image-frontend": "^0.9.187",
47
+ "@live-change/message-authentication-service": "^0.9.187",
48
+ "@live-change/notification-service": "^0.9.187",
49
+ "@live-change/password-authentication-service": "^0.9.187",
50
+ "@live-change/pattern": "^0.9.187",
51
+ "@live-change/secret-code-service": "^0.9.187",
52
+ "@live-change/secret-link-service": "^0.9.187",
53
+ "@live-change/security-frontend": "^0.9.187",
54
+ "@live-change/security-service": "^0.9.187",
55
+ "@live-change/session-service": "^0.9.187",
56
+ "@live-change/timer-service": "^0.9.187",
57
+ "@live-change/upload-service": "^0.9.187",
58
+ "@live-change/user-identification-service": "^0.9.187",
59
+ "@live-change/user-service": "^0.9.187",
60
+ "@live-change/vue3-components": "^0.9.187",
61
+ "@live-change/vue3-ssr": "^0.9.187",
62
62
  "@vueuse/core": "^12.3.0",
63
63
  "codeceptjs-assert": "^0.0.5",
64
64
  "codeceptjs-video-helper": "0.1.3",
@@ -79,7 +79,7 @@
79
79
  "wtfnode": "^0.9.1"
80
80
  },
81
81
  "devDependencies": {
82
- "@live-change/codeceptjs-helper": "^0.9.185",
82
+ "@live-change/codeceptjs-helper": "^0.9.187",
83
83
  "codeceptjs": "^3.6.10",
84
84
  "generate-password": "1.7.1",
85
85
  "playwright": "1.49.1",
@@ -90,5 +90,5 @@
90
90
  "author": "Michał Łaszczewski <michal@laszczewski.pl>",
91
91
  "license": "BSD-3-Clause",
92
92
  "description": "",
93
- "gitHead": "f8f4caa3498f2dc1229e17adc1a3024dbb772b25"
93
+ "gitHead": "9cb9fc01eebdafb342a419cde03eafdf467eaa32"
94
94
  }