diff --git a/apps/client/vite.config.ts b/apps/client/vite.config.ts index 20316f4b..3619a554 100644 --- a/apps/client/vite.config.ts +++ b/apps/client/vite.config.ts @@ -2,7 +2,7 @@ import { lingui } from "@lingui/vite-plugin"; import { nxViteTsPaths } from "@nx/vite/plugins/nx-tsconfig-paths.plugin"; -import react from "@vitejs/plugin-react-swc"; +import react from "@vitejs/plugin-react"; import { defineConfig, searchForWorkspaceRoot, splitVendorChunkPlugin } from "vite"; export default defineConfig({ @@ -32,7 +32,9 @@ export default defineConfig({ plugins: [ react({ - plugins: [["@lingui/swc-plugin", {}]], + babel: { + plugins: ["macros"], + }, }), lingui(), nxViteTsPaths(), diff --git a/apps/server/src/printer/printer.service.ts b/apps/server/src/printer/printer.service.ts index 64c11f9a..586f73d9 100644 --- a/apps/server/src/printer/printer.service.ts +++ b/apps/server/src/printer/printer.service.ts @@ -48,52 +48,42 @@ export class PrinterService { } async printResume(resume: ResumeDto) { - return this.utils.getCachedOrSet( - `user:${resume.userId}:storage:resumes:${resume.id}`, - async () => { - const start = performance.now(); + const start = performance.now(); - const url = await retry(() => this.generateResume(resume), { - retries: 3, - randomize: true, - onRetry: (_, attempt) => { - this.logger.log(`Retrying to print resume #${resume.id}, attempt #${attempt}`); - }, - }); - - const duration = Number(performance.now() - start).toFixed(0); - const numPages = resume.data.metadata.layout.length; - - this.logger.debug(`Chrome took ${duration}ms to print ${numPages} page(s)`); - - return url; + const url = await retry(() => this.generateResume(resume), { + retries: 3, + randomize: true, + onRetry: (_, attempt) => { + this.logger.log(`Retrying to print resume #${resume.id}, attempt #${attempt}`); }, - ); + }); + + const duration = Number(performance.now() - start).toFixed(0); + const numPages = resume.data.metadata.layout.length; + + this.logger.debug(`Chrome took ${duration}ms to print ${numPages} page(s)`); + + return url; } async printPreview(resume: ResumeDto) { - return this.utils.getCachedOrSet( - `user:${resume.userId}:storage:previews:${resume.id}`, - async () => { - const start = performance.now(); + const start = performance.now(); - const url = await retry(() => this.generatePreview(resume), { - retries: 3, - randomize: true, - onRetry: (_, attempt) => { - this.logger.log( - `Retrying to generate preview of resume #${resume.id}, attempt #${attempt}`, - ); - }, - }); - - const duration = Number(performance.now() - start).toFixed(0); - - this.logger.debug(`Chrome took ${duration}ms to generate preview`); - - return url; + const url = await retry(() => this.generatePreview(resume), { + retries: 3, + randomize: true, + onRetry: (_, attempt) => { + this.logger.log( + `Retrying to generate preview of resume #${resume.id}, attempt #${attempt}`, + ); }, - ); + }); + + const duration = Number(performance.now() - start).toFixed(0); + + this.logger.debug(`Chrome took ${duration}ms to generate preview`); + + return url; } async generateResume(resume: ResumeDto) { diff --git a/apps/server/src/resume/resume.controller.ts b/apps/server/src/resume/resume.controller.ts index 991d12a1..a8b868d7 100644 --- a/apps/server/src/resume/resume.controller.ts +++ b/apps/server/src/resume/resume.controller.ts @@ -115,7 +115,7 @@ export class ResumeController { @Patch(":id/lock") @UseGuards(TwoFactorGuard) - lock(@User() user: UserEntity, @Param("id") id: string, @Body("set") set: boolean = true) { + lock(@User() user: UserEntity, @Param("id") id: string, @Body("set") set = true) { return this.resumeService.lock(user.id, id, set); } diff --git a/apps/server/src/resume/resume.service.ts b/apps/server/src/resume/resume.service.ts index e358fa01..78fac1d3 100644 --- a/apps/server/src/resume/resume.service.ts +++ b/apps/server/src/resume/resume.service.ts @@ -54,10 +54,10 @@ export class ResumeService { }, }); - await Promise.all([ - this.redis.del(`user:${userId}:resumes`), - this.redis.set(`user:${userId}:resume:${resume.id}`, JSON.stringify(resume)), - ]); + // await Promise.all([ + // this.redis.del(`user:${userId}:resumes`), + // this.redis.set(`user:${userId}:resume:${resume.id}`, JSON.stringify(resume)), + // ]); return resume; } @@ -75,37 +75,24 @@ export class ResumeService { }, }); - await Promise.all([ - this.redis.del(`user:${userId}:resumes`), - this.redis.set(`user:${userId}:resume:${resume.id}`, JSON.stringify(resume)), - ]); + // await Promise.all([ + // this.redis.del(`user:${userId}:resumes`), + // this.redis.set(`user:${userId}:resume:${resume.id}`, JSON.stringify(resume)), + // ]); return resume; } findAll(userId: string) { - return this.utils.getCachedOrSet(`user:${userId}:resumes`, () => - this.prisma.resume.findMany({ - where: { userId }, - orderBy: { updatedAt: "desc" }, - }), - ); + return this.prisma.resume.findMany({ where: { userId }, orderBy: { updatedAt: "desc" } }); } findOne(id: string, userId?: string) { if (userId) { - return this.utils.getCachedOrSet(`user:${userId}:resume:${id}`, () => - this.prisma.resume.findUniqueOrThrow({ - where: { userId_id: { userId, id } }, - }), - ); + return this.prisma.resume.findUniqueOrThrow({ where: { userId_id: { userId, id } } }); } - return this.utils.getCachedOrSet(`user:public:resume:${id}`, () => - this.prisma.resume.findUniqueOrThrow({ - where: { id }, - }), - ); + return this.prisma.resume.findUniqueOrThrow({ where: { id } }); } async findOneStatistics(userId: string, id: string) { @@ -149,12 +136,12 @@ export class ResumeService { where: { userId_id: { userId, id } }, }); - await Promise.all([ - this.redis.set(`user:${userId}:resume:${id}`, JSON.stringify(resume)), - this.redis.del(`user:${userId}:resumes`), - this.redis.del(`user:${userId}:storage:resumes:${id}`), - this.redis.del(`user:${userId}:storage:previews:${id}`), - ]); + // await Promise.all([ + // this.redis.set(`user:${userId}:resume:${id}`, JSON.stringify(resume)), + // this.redis.del(`user:${userId}:resumes`), + // this.redis.del(`user:${userId}:storage:resumes:${id}`), + // this.redis.del(`user:${userId}:storage:previews:${id}`), + // ]); return resume; } catch (error) { @@ -171,10 +158,10 @@ export class ResumeService { where: { userId_id: { userId, id } }, }); - await Promise.all([ - this.redis.set(`user:${userId}:resume:${id}`, JSON.stringify(resume)), - this.redis.del(`user:${userId}:resumes`), - ]); + // await Promise.all([ + // this.redis.set(`user:${userId}:resume:${id}`, JSON.stringify(resume)), + // this.redis.del(`user:${userId}:resumes`), + // ]); return resume; } @@ -182,8 +169,8 @@ export class ResumeService { async remove(userId: string, id: string) { await Promise.all([ // Remove cached keys - this.redis.del(`user:${userId}:resumes`), - this.redis.del(`user:${userId}:resume:${id}`), + // this.redis.del(`user:${userId}:resumes`), + // this.redis.del(`user:${userId}:resume:${id}`), // Remove files in storage, and their cached keys this.storageService.deleteObject(userId, "resumes", id), diff --git a/libs/hooks/src/hooks/use-theme.ts b/libs/hooks/src/hooks/use-theme.ts index 29f8da4e..9c98f506 100644 --- a/libs/hooks/src/hooks/use-theme.ts +++ b/libs/hooks/src/hooks/use-theme.ts @@ -1,5 +1,5 @@ import { type Dispatch, type SetStateAction, useEffect, useState } from "react"; -import { useLocalStorage, useMediaQuery, useUpdateEffect } from "usehooks-ts"; +import { useLocalStorage, useMediaQuery } from "usehooks-ts"; const COLOR_SCHEME_QUERY = "(prefers-color-scheme: dark)"; @@ -17,9 +17,9 @@ export const useTheme = (): UseThemeOutput => { const [isDarkMode, setDarkMode] = useState(isDarkOS); const [theme, setTheme] = useLocalStorage("theme", "system"); - useUpdateEffect(() => { - if (theme === "system") setDarkMode(isDarkOS); - }, [isDarkOS]); + useEffect(() => { + if (theme === "system") setDarkMode((prev) => !prev); + }, [theme]); useEffect(() => { switch (theme) { diff --git a/libs/ui/src/components/rich-input.tsx b/libs/ui/src/components/rich-input.tsx index d9c71684..37996480 100644 --- a/libs/ui/src/components/rich-input.tsx +++ b/libs/ui/src/components/rich-input.tsx @@ -34,7 +34,7 @@ import { Link } from "@tiptap/extension-link"; import { TextAlign } from "@tiptap/extension-text-align"; import { Underline } from "@tiptap/extension-underline"; import { Editor, EditorContent, EditorContentProps, useEditor } from "@tiptap/react"; -import { StarterKit } from "@tiptap/starter-kit"; +import StarterKit from "@tiptap/starter-kit"; import { forwardRef, useCallback } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod";