diff --git a/apps/app/components/molecules/SearchModal.vue b/apps/app/components/molecules/SearchModal.vue
index af3ad69..65bda54 100644
--- a/apps/app/components/molecules/SearchModal.vue
+++ b/apps/app/components/molecules/SearchModal.vue
@@ -1,5 +1,6 @@
@@ -58,11 +53,9 @@ function signOut() {
-
+
+
+
diff --git a/apps/app/components/organisms/DefaultAside.vue b/apps/app/components/organisms/DefaultAside.vue
index a310505..c81d4d4 100644
--- a/apps/app/components/organisms/DefaultAside.vue
+++ b/apps/app/components/organisms/DefaultAside.vue
@@ -7,7 +7,7 @@ const queryBuilder = computed(() => {
return queryContent(`/${route.params?.slug ? route.params.slug[0] : ""}`);
});
-const { data: navigation } = await useAsyncData(
+const { data: navigation, refresh } = await useAsyncData(
route.params?.slug ? route.params.slug[0] : "navigation",
() => fetchContentNavigation(queryBuilder.value),
{
@@ -18,6 +18,10 @@ const { data: navigation } = await useAsyncData(
const isLesson = computed(() => {
return !!route.meta?.lesson;
});
+
+watch(isLesson, async () => {
+ refresh();
+});
diff --git a/apps/app/composables/useCookieFetch.ts b/apps/app/composables/useCookieFetch.ts
new file mode 100644
index 0000000..23561a3
--- /dev/null
+++ b/apps/app/composables/useCookieFetch.ts
@@ -0,0 +1,10 @@
+import { appendResponseHeader, H3Event } from "h3";
+
+export const useCookieFetch = async (event: H3Event, url: string) => {
+ const res = await $fetch.raw(url);
+ const cookies = (res.headers.get("set-cookie") || "").split(",");
+ for (const cookie of cookies) {
+ appendResponseHeader(event, "set-cookie", cookie);
+ }
+ return res._data;
+};
diff --git a/apps/app/layouts/default.vue b/apps/app/layouts/default.vue
index cb6885d..d22ecfa 100644
--- a/apps/app/layouts/default.vue
+++ b/apps/app/layouts/default.vue
@@ -2,6 +2,7 @@
const userStore = useUserStore();
const sessionStore = useSessionStore();
const defaultAsideStore = useDefaultAsideStore();
+sessionStore.refreshSession();
const content = ref();
diff --git a/apps/app/middleware/session.global.ts b/apps/app/middleware/session.global.ts
index fce17cc..1956a02 100644
--- a/apps/app/middleware/session.global.ts
+++ b/apps/app/middleware/session.global.ts
@@ -1,19 +1,15 @@
-import { useCookies } from "@vueuse/integrations/useCookies";
-
export default defineNuxtRouteMiddleware(async (to) => {
- if (to.query.oauth) return;
-
- const sessionStore = useSessionStore();
const userStore = useUserStore();
+ const serverUser = useCookie("m-user");
- const userCookie = useCookies([]);
- const userCookieValue = userCookie.get("m-user");
- if (userCookieValue) {
- userStore.user = userCookieValue;
- console.log({ userCookieValue });
+ if (serverUser) {
+ userStore.user = serverUser.value as typeof userStore.user;
}
- const serverHasSession = sessionStore.hasSession();
+ if (to.query.oauth) return;
+
+ const sessionStore = useSessionStore();
+ const serverHasSession = !!serverUser.value || sessionStore.hasSession();
if (["profile"].includes(String(to.name)) && !serverHasSession) {
return navigateTo("/sign-in");
diff --git a/apps/app/modules/eslint-globals.ts b/apps/app/modules/eslint-globals.ts
index a701c96..a0440f1 100644
--- a/apps/app/modules/eslint-globals.ts
+++ b/apps/app/modules/eslint-globals.ts
@@ -59,7 +59,7 @@ const autoImportEslint = defineNuxtModule({
getContents,
write: true,
});
- console.log(`globals file is generated at ${fullPath}`);
+ // console.log(`globals file is generated at ${fullPath}`);
});
},
});
diff --git a/apps/app/package.json b/apps/app/package.json
index 03ca764..735b212 100644
--- a/apps/app/package.json
+++ b/apps/app/package.json
@@ -10,7 +10,7 @@
"postinstall": "nuxt prepare"
},
"devDependencies": {
- "@nuxt/content": "^2.8.2",
+ "@nuxt/content": "npm:@nuxt/content-edge@latest",
"@nuxtjs/fontaine": "^0.2.5",
"@types/node": "^20.4.6",
"nuxt": "^3.7.3",
diff --git a/apps/app/pages/code.vue b/apps/app/pages/code.vue
index 6f3a9de..68e4119 100644
--- a/apps/app/pages/code.vue
+++ b/apps/app/pages/code.vue
@@ -23,8 +23,9 @@ async function sendCode() {
await signUpStore.attemptEmailAddressVerification({
code: code.join(""),
});
- await sessionStore.refreshSession();
userStore.setUser();
+ await sessionStore.refreshSession();
+
router.push("/");
} catch (e) {
toast?.error("Código incorreto ou expirado.");
diff --git a/apps/app/pages/sign-in.vue b/apps/app/pages/sign-in.vue
index 8be4f37..9a42be7 100644
--- a/apps/app/pages/sign-in.vue
+++ b/apps/app/pages/sign-in.vue
@@ -100,7 +100,7 @@ async function clerkOAuth({ strategy }: { strategy: string }) {
/>
({
@@ -24,7 +25,17 @@ export const useSessionStore = defineStore("session", {
},
async refreshSession() {
const clientSession = this.$clerk?.client?.sessions[0];
- await this.$clerk.setSession(clientSession);
+ if (!clientSession) return;
+ try {
+ await this.$clerk.setSession(clientSession);
+ } catch (e) {
+ const clerkError: { errors: ClerkAPIError[] } | any = e;
+ if (clerkError.errors[0].code === "authentication_invalid") {
+ this.$router.push("/sign-out");
+ }
+
+ throw new Error((e as Error).message);
+ }
},
async signOut() {
const clerkToken = useCookies([]);
diff --git a/apps/app/stores/clerk/user.ts b/apps/app/stores/clerk/user.ts
index 4b2be58..df43c15 100644
--- a/apps/app/stores/clerk/user.ts
+++ b/apps/app/stores/clerk/user.ts
@@ -36,11 +36,12 @@ export const useUserStore = defineStore("user", {
const userData = this.$clerk.user
? this.$clerk.user
: this.$clerk.client.sessions[0]?.user;
+
if (!userData) return;
this.user = userData;
const userCookie = useCookies([]);
- userCookie.set("rise-user", userData);
+ userCookie.set("m-user", userData);
},
async updateUser() {
await this.$clerk.user.update({
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6478d6d..bf77ae0 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -76,8 +76,8 @@ importers:
version: 4.0.4
devDependencies:
'@nuxt/content':
- specifier: ^2.8.2
- version: 2.8.2(vue@3.3.4)
+ specifier: npm:@nuxt/content-edge@latest
+ version: /@nuxt/content-edge@2.8.2-28257873.469c259(vue@3.3.4)
'@nuxtjs/fontaine':
specifier: ^0.2.5
version: 0.2.5
@@ -1524,21 +1524,23 @@ packages:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.15.0
- /@nuxt/content@2.8.2(vue@3.3.4):
- resolution: {integrity: sha512-fi5/axuYNGccJ/dXyaf5C/WqgEd5wSijpGHZ9O+pH7754S2NeKyx8fUFGfXsLN9VyJP+Mx8EUihfWKJm09SCRA==}
+ /@nuxt/content-edge@2.8.2-28257873.469c259(vue@3.3.4):
+ resolution: {integrity: sha512-SRzsAYYKxQ5D8P1dsUaiaRqKuS+zgGMacCWBz3aAUlxYQ3XEQ4UN9aFtZy/X4nqL0CEteDri/8GQQVCoRwtZFA==}
dependencies:
'@nuxt/kit': 3.7.3
- '@nuxtjs/mdc': 0.1.6
- '@vueuse/head': 1.3.1(vue@3.3.4)
+ '@nuxtjs/mdc': 0.2.0
+ '@vueuse/head': 2.0.0(vue@3.3.4)
consola: 3.2.3
defu: 6.1.2
destr: 2.0.1
json5: 2.2.3
knitwork: 1.0.0
listhen: 1.5.5
+ mdast-util-to-string: 4.0.0
mdurl: 1.0.1
micromark: 4.0.0
micromark-util-sanitize-uri: 2.0.0
+ micromark-util-types: 2.0.0
ohash: 1.1.3
pathe: 1.1.1
scule: 1.0.0
@@ -1546,6 +1548,7 @@ packages:
slugify: 1.6.6
socket.io-client: 4.7.2
ufo: 1.3.0
+ unist-util-stringify-position: 4.0.0
unstorage: 1.9.0
ws: 8.14.2
transitivePeerDependencies:
@@ -1826,8 +1829,8 @@ packages:
- supports-color
dev: true
- /@nuxtjs/mdc@0.1.6:
- resolution: {integrity: sha512-zJuq5KwU3d1Dlh1sudnpVtIFoap09ZrvO9IAM1iP4tipzSRkgHFbCOTMEmK17Rx7KSdmvBbFP+/4MBaJdj1NqQ==}
+ /@nuxtjs/mdc@0.2.0:
+ resolution: {integrity: sha512-7bF7yyMw15YLUh+bUTgqUpW6lSqc8dXsF4rmTDe51hn93w++d9JThTz4epkNZcaXUkAU+FJB26OHq+G280AgTw==}
dependencies:
'@nuxt/kit': 3.7.3
'@types/hast': 3.0.1
@@ -1843,9 +1846,9 @@ packages:
micromark-util-sanitize-uri: 2.0.0
ohash: 1.1.3
property-information: 6.3.0
- rehype-external-links: 2.1.0
+ rehype-external-links: 3.0.0
rehype-raw: 6.1.1
- rehype-slug: 5.1.0
+ rehype-slug: 6.0.0
rehype-sort-attribute-values: 5.0.0
rehype-sort-attributes: 5.0.0
remark-emoji: 4.0.0
@@ -1854,7 +1857,7 @@ packages:
remark-parse: 10.0.2
remark-rehype: 10.1.0
scule: 1.0.0
- shiki-es: 0.14.0
+ shikiji: 0.6.8
ufo: 1.3.0
unified: 11.0.3
unist-builder: 4.0.0
@@ -2855,8 +2858,8 @@ packages:
- vue
dev: false
- /@vueuse/head@1.3.1(vue@3.3.4):
- resolution: {integrity: sha512-XCcHGfDzkGlHS7KIPJVYN//L7jpfASLsN7MUE19ndHVQLnPIDxqFLDl7IROsY81PKzawVAUe4OYVWcGixseWxA==}
+ /@vueuse/head@2.0.0(vue@3.3.4):
+ resolution: {integrity: sha512-ykdOxTGs95xjD4WXE4na/umxZea2Itl0GWBILas+O4oqS7eXIods38INvk3XkJKjqMdWPcpCyLX/DioLQxU1KA==}
peerDependencies:
vue: '>=2.7 || >=3'
dependencies:
@@ -4982,21 +4985,23 @@ packages:
web-namespaces: 2.0.1
dev: true
- /hast-util-has-property@2.0.1:
- resolution: {integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==}
- dev: true
-
- /hast-util-heading-rank@2.1.1:
- resolution: {integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==}
+ /hast-util-from-parse5@8.0.1:
+ resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==}
dependencies:
- '@types/hast': 2.3.6
+ '@types/hast': 3.0.1
+ '@types/unist': 3.0.0
+ devlop: 1.1.0
+ hastscript: 8.0.0
+ property-information: 6.3.0
+ vfile: 6.0.1
+ vfile-location: 5.0.2
+ web-namespaces: 2.0.1
dev: true
- /hast-util-is-element@2.1.3:
- resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==}
+ /hast-util-heading-rank@3.0.0:
+ resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==}
dependencies:
- '@types/hast': 2.3.6
- '@types/unist': 2.0.8
+ '@types/hast': 3.0.1
dev: true
/hast-util-is-element@3.0.0:
@@ -5011,6 +5016,12 @@ packages:
'@types/hast': 2.3.6
dev: true
+ /hast-util-parse-selector@4.0.0:
+ resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+ dependencies:
+ '@types/hast': 3.0.1
+ dev: true
+
/hast-util-raw@7.2.3:
resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==}
dependencies:
@@ -5027,6 +5038,41 @@ packages:
zwitch: 2.0.4
dev: true
+ /hast-util-raw@9.0.1:
+ resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==}
+ dependencies:
+ '@types/hast': 3.0.1
+ '@types/unist': 3.0.0
+ '@ungap/structured-clone': 1.2.0
+ hast-util-from-parse5: 8.0.1
+ hast-util-to-parse5: 8.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.0.2
+ parse5: 7.1.2
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.1
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+ dev: true
+
+ /hast-util-to-html@9.0.0:
+ resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==}
+ dependencies:
+ '@types/hast': 3.0.1
+ '@types/unist': 3.0.0
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-raw: 9.0.1
+ hast-util-whitespace: 3.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.0.2
+ property-information: 6.3.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.3
+ zwitch: 2.0.4
+ dev: true
+
/hast-util-to-parse5@7.1.0:
resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==}
dependencies:
@@ -5038,10 +5084,16 @@ packages:
zwitch: 2.0.4
dev: true
- /hast-util-to-string@2.0.0:
- resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==}
+ /hast-util-to-parse5@8.0.0:
+ resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
dependencies:
- '@types/hast': 2.3.6
+ '@types/hast': 3.0.1
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ property-information: 6.3.0
+ space-separated-tokens: 2.0.2
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
dev: true
/hast-util-to-string@3.0.0:
@@ -5050,6 +5102,12 @@ packages:
'@types/hast': 3.0.1
dev: true
+ /hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+ dependencies:
+ '@types/hast': 3.0.1
+ dev: true
+
/hastscript@7.2.0:
resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==}
dependencies:
@@ -5060,6 +5118,16 @@ packages:
space-separated-tokens: 2.0.2
dev: true
+ /hastscript@8.0.0:
+ resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
+ dependencies:
+ '@types/hast': 3.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 6.3.0
+ space-separated-tokens: 2.0.2
+ dev: true
+
/hoist-non-react-statics@3.3.2:
resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
dependencies:
@@ -5111,6 +5179,10 @@ packages:
resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
dev: true
+ /html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+ dev: true
+
/htmlparser2@8.0.1:
resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==}
dependencies:
@@ -7230,6 +7302,12 @@ packages:
resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
dev: true
+ /parse5@7.1.2:
+ resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
+ dependencies:
+ entities: 4.5.0
+ dev: true
+
/parseley@0.11.0:
resolution: {integrity: sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==}
dependencies:
@@ -8095,16 +8173,15 @@ packages:
set-function-name: 2.0.1
dev: true
- /rehype-external-links@2.1.0:
- resolution: {integrity: sha512-2YMJZVM1hxZnwl9IPkbN5Pjn78kXkAX7lq9VEtlaGA29qIls25vZN+ucNIJdbQUe+9NNFck17BiOhGmsD6oLIg==}
+ /rehype-external-links@3.0.0:
+ resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==}
dependencies:
- '@types/hast': 2.3.6
- extend: 3.0.2
- hast-util-is-element: 2.1.3
+ '@types/hast': 3.0.1
+ '@ungap/structured-clone': 1.2.0
+ hast-util-is-element: 3.0.0
is-absolute-url: 4.0.1
space-separated-tokens: 2.0.2
- unified: 10.1.2
- unist-util-visit: 4.1.2
+ unist-util-visit: 5.0.0
dev: true
/rehype-raw@6.1.1:
@@ -8115,16 +8192,14 @@ packages:
unified: 10.1.2
dev: true
- /rehype-slug@5.1.0:
- resolution: {integrity: sha512-Gf91dJoXneiorNEnn+Phx97CO7oRMrpi+6r155tTxzGuLtm+QrI4cTwCa9e1rtePdL4i9tSO58PeSS6HWfgsiw==}
+ /rehype-slug@6.0.0:
+ resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==}
dependencies:
- '@types/hast': 2.3.6
+ '@types/hast': 3.0.1
github-slugger: 2.0.0
- hast-util-has-property: 2.0.1
- hast-util-heading-rank: 2.1.1
- hast-util-to-string: 2.0.0
- unified: 10.1.2
- unist-util-visit: 4.1.2
+ hast-util-heading-rank: 3.0.0
+ hast-util-to-string: 3.0.0
+ unist-util-visit: 5.0.0
dev: true
/rehype-sort-attribute-values@5.0.0:
@@ -8440,6 +8515,12 @@ packages:
resolution: {integrity: sha512-e+/aueHx0YeIEut6RXC6K8gSf0PykwZiHD7q7AHtpTW8Kd8TpFUIWqTwhAnrGjOyOMyrwv+syr5WPagMpDpVYQ==}
dev: true
+ /shikiji@0.6.8:
+ resolution: {integrity: sha512-K0axxNAdB9KvLUflU7QoLC7p6i2p1R2MFG0eP+iclbjtuEZqng99jHcg3VJL0GWRO67yozTICnykjo1HjOzdkg==}
+ dependencies:
+ hast-util-to-html: 9.0.0
+ dev: true
+
/side-channel@1.0.4:
resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
dependencies:
@@ -9473,6 +9554,13 @@ packages:
vfile: 5.3.7
dev: true
+ /vfile-location@5.0.2:
+ resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==}
+ dependencies:
+ '@types/unist': 3.0.0
+ vfile: 6.0.1
+ dev: true
+
/vfile-message@3.1.4:
resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==}
dependencies: