diff --git a/.changeset/config.json b/.changeset/config.json deleted file mode 100644 index 7602f50d8..000000000 --- a/.changeset/config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://unpkg.com/@changesets/config@1.7.0/schema.json", - "changelog": "@changesets/cli/changelog", - "commit": false, - "fixed": [], - "linked": [], - "ignore": [], - "baseBranch": "v3", - "access": "restricted", - "updateInternalDependencies": "patch" -} diff --git a/.env.example b/.env.example index 9bef55119..57df0d2b3 100644 --- a/.env.example +++ b/.env.example @@ -23,7 +23,7 @@ GOOGLE_CLIENT_SECRET=change-me GOOGLE_API_KEY=change-me # SendGrid (Optional) -SENDGRID_API_KEY=change-me -SENDGRID_FORGOT_PASSWORD_TEMPLATE_ID=change-me -SENDGRID_FROM_NAME="Reactive Resume" -SENDGRID_FROM_EMAIL="noreply@rxresu.me" \ No newline at end of file +SENDGRID_API_KEY= +SENDGRID_FORGOT_PASSWORD_TEMPLATE_ID= +SENDGRID_FROM_NAME= +SENDGRID_FROM_EMAIL= \ No newline at end of file diff --git a/.github/workflows/docker-build-push.yml b/.github/workflows/docker-build-push.yml index 4a602a958..805437010 100644 --- a/.github/workflows/docker-build-push.yml +++ b/.github/workflows/docker-build-push.yml @@ -1,9 +1,8 @@ name: Build and Push Docker Image on: - push: - branches: - - v3 + release: + types: [published] jobs: docker_client: diff --git a/.vscode/settings.json b/.vscode/settings.json index 9be88e015..270157643 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,9 +8,8 @@ "editor.formatOnSave": true, "editor.wordWrap": "on", "eslint.workingDirectories": ["schema", "client", "server"], - "i18n-ally.keystyle": "nested", + "i18n-ally.enabledFrameworks": ["i18next"], "i18n-ally.localesPaths": ["client/public/locales"], - "i18n-ally.namespace": true, - "i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}", - "i18n-ally.sortKeys": true + "i18n-ally.sourceLanguage": "en", + "i18n-ally.keystyle": "nested" } diff --git a/CHANGELOG.md b/CHANGELOG.md index e4e074cf3..57b5779c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,19 @@ -# Changelog | Reactive Resume +## v3.0.0-beta.1 (2022-03-09) -## 3.0.0 +### New feature: -### Major Changes +- **client/landing**: add testimonials section to landing page([`6f02048`](https://github.com/AmruthPillai/Reactive-Resume/commit/6f02048ebd29b2a5b53aa291e0cdd10df93d032f)) (by Amruth Pillai) +- **client**: add language selector, language detector and privacy/tos pages([`a131bb3`](https://github.com/AmruthPillai/Reactive-Resume/commit/a131bb36525bf85eaee5cdb65542289cdfcff36e)) (by Amruth Pillai) -- Initial Release of Reactive Resume v3 +### Bugs fixed: + +- **pnpm**: install deps to update pnpm-lock.yaml([`54fd97b`](https://github.com/AmruthPillai/Reactive-Resume/commit/54fd97b5ecce629456a0dd1848981658136bbaa9)) (by Amruth Pillai) +- **mail.service**: use sendgrid api instead of nodemailer for better deliverability([`9df1219`](https://github.com/AmruthPillai/Reactive-Resume/commit/9df12194bf465d2f9c040c642036e05edef8d945)) (by Amruth Pillai) +- **printer.service**: add --disable-dev-shm-usage flag to chromium headless playwright browser([`e96b090`](https://github.com/AmruthPillai/Reactive-Resume/commit/e96b09090485fefc044dfc8e3daa9f52e123d946)) (by Amruth Pillai) +- **playwright**: use playwright docker image due to runtime error([`2696a54`](https://github.com/AmruthPillai/Reactive-Resume/commit/2696a54d176dd8821be97881447e075c05f9e8fb)) (by Amruth Pillai) +- **databasemodule**: make ssl optional, pass ca cert as base64 env([`c738f31`](https://github.com/AmruthPillai/Reactive-Resume/commit/c738f311dabdbe77770bb3c33959ac121d60019e)) (by Amruth Pillai) +- **i18n**: load locales from file system, instead of http-backend([`a4983ac`](https://github.com/AmruthPillai/Reactive-Resume/commit/a4983ac6bc35efee5b10de0768203dec9110b866)) (by Amruth Pillai) + +### Performance improves: + +- **app**: working docker build stage, with github actions ci to push image([`5104ea6`](https://github.com/AmruthPillai/Reactive-Resume/commit/5104ea6438d5e37d6c591949d6b3861cef4295b7)) (by Amruth Pillai) diff --git a/README.md b/README.md index e918d355a..ecb623ecc 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@ # Reactive Resume -![Docker Pulls](https://img.shields.io/docker/pulls/amruthpillai/reactive-resume?style=flat-square) +[![Docker Pulls](https://img.shields.io/docker/pulls/amruthpillai/reactive-resume?style=flat-square)](https://hub.docker.com/r/amruthpillai/reactive-resume) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FAmruthPillai%2FReactive-Resume.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2FAmruthPillai%2FReactive-Resume?ref=badge_shield) ## [Go to App](https://beta.rxresu.me/) diff --git a/client/Dockerfile b/client/Dockerfile index 9d1de4ba5..95db39b1f 100644 --- a/client/Dockerfile +++ b/client/Dockerfile @@ -34,8 +34,8 @@ WORKDIR /app RUN apk add --no-cache curl \ && curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm -COPY --from=builder /app/pnpm-*.yaml . -COPY --from=builder /app/package.json . +COPY --from=builder /app/pnpm-*.yaml ./ +COPY --from=builder /app/package.json ./ COPY --from=builder /app/client/.next ./client/.next COPY --from=builder /app/client/public ./client/public COPY --from=builder /app/client/next.config.js ./client/next.config.js diff --git a/client/components/build/RightSidebar/sections/Settings.tsx b/client/components/build/RightSidebar/sections/Settings.tsx index 1403cb400..d1daedb18 100644 --- a/client/components/build/RightSidebar/sections/Settings.tsx +++ b/client/components/build/RightSidebar/sections/Settings.tsx @@ -19,11 +19,11 @@ import { useMutation } from 'react-query'; import Heading from '@/components/shared/Heading'; import ThemeSwitch from '@/components/shared/ThemeSwitch'; -import { Language, languageMap, languages } from '@/config/languages'; +import { Language, languages } from '@/config/languages'; import { ServerError } from '@/services/axios'; import queryClient from '@/services/react-query'; import { loadSampleData, LoadSampleDataParams, resetResume, ResetResumeParams } from '@/services/resume'; -import { setTheme, togglePageBreakLine, togglePageOrientation } from '@/store/build/buildSlice'; +import { setLanguage, setTheme, togglePageBreakLine, togglePageOrientation } from '@/store/build/buildSlice'; import { useAppDispatch, useAppSelector } from '@/store/hooks'; import { setResumeState } from '@/store/resume/resumeSlice'; import { dateFormatOptions } from '@/utils/date'; @@ -35,13 +35,13 @@ const Settings = () => { const resume = useAppSelector((state) => state.resume); const theme = useAppSelector((state) => state.build.theme); + const language = useAppSelector((state) => state.build.language); const breakLine = useAppSelector((state) => state.build.page.breakLine); const orientation = useAppSelector((state) => state.build.page.orientation); const id: number = useMemo(() => get(resume, 'id'), [resume]); const slug: string = useMemo(() => get(resume, 'slug'), [resume]); const username: string = useMemo(() => get(resume, 'user.username'), [resume]); - const language: string = useMemo(() => get(resume, 'metadata.language'), [resume]); const dateConfig: DateConfig = useMemo(() => get(resume, 'metadata.date'), [resume]); const isDarkMode = useMemo(() => theme === 'dark', [theme]); @@ -58,8 +58,9 @@ const Settings = () => { const handleChangeDateFormat = (value: string | null) => dispatch(setResumeState({ path: 'metadata.date.format', value })); - const handleChangeLanguage = (value: Language | null) => - dispatch(setResumeState({ path: 'metadata.language', value: value?.code })); + const handleChangeLanguage = (value: Language | null) => { + dispatch(setLanguage({ language: value?.code || 'en' })); + }; const handleLoadSampleData = async () => { await loadSampleDataMutation({ id }); @@ -121,7 +122,10 @@ const Settings = () => { disableClearable className="my-2 w-full" options={languages} - value={languageMap[language]} + value={language} + isOptionEqualToValue={(a, b) => a.code === b.code} + onChange={(_, value) => handleChangeLanguage(value)} + renderInput={(params) => } getOptionLabel={(language) => { if (language.localName) { return `${language.name} (${language.localName})`; @@ -129,9 +133,6 @@ const Settings = () => { return language.name; }} - isOptionEqualToValue={(a, b) => a.code === b.code} - onChange={(_, value) => handleChangeLanguage(value)} - renderInput={(params) => } /> diff --git a/client/components/landing/Testimony.module.scss b/client/components/landing/Testimony.module.scss new file mode 100644 index 000000000..43b186fed --- /dev/null +++ b/client/components/landing/Testimony.module.scss @@ -0,0 +1,12 @@ +.testimony { + @apply grid gap-2; + @apply border-2 rounded p-4 dark:border-neutral-800; + + blockquote { + @apply text-xs leading-normal text-justify opacity-90; + } + + figcaption { + @apply text-xs opacity-60; + } +} diff --git a/client/components/landing/Testimony.tsx b/client/components/landing/Testimony.tsx new file mode 100644 index 000000000..46ca2b36b --- /dev/null +++ b/client/components/landing/Testimony.tsx @@ -0,0 +1,17 @@ +import { Testimony } from '@/data/testimonials'; + +import styles from './Testimony.module.scss'; + +type Props = Testimony; + +const Testimony: React.FC = ({ name, message }) => { + return ( +
+
{message}
+ +
— {name}
+
+ ); +}; + +export default Testimony; diff --git a/client/components/shared/Logo.tsx b/client/components/shared/Logo.tsx index 779b9b17c..d15236625 100644 --- a/client/components/shared/Logo.tsx +++ b/client/components/shared/Logo.tsx @@ -5,7 +5,7 @@ type Props = { }; const Logo: React.FC = ({ size = 64 }) => { - return Reactive Resume; + return Reactive Resume; }; export default Logo; diff --git a/client/data/testimonials.ts b/client/data/testimonials.ts new file mode 100644 index 000000000..372e74030 --- /dev/null +++ b/client/data/testimonials.ts @@ -0,0 +1,38 @@ +export type Testimony = { + name: string; + message: string; +}; + +const testimonials: Testimony[] = [ + { + name: 'Yogeshwar B.', + message: `Hi Amruth! First off, many thanks for making RxResume! It was love at first sight for me when I saw it was a FOSS resume-builder with such a polished UI. It's been of great help for me as I've been applying to MS programs in international universities. The generated resume is slick as hell, and I spent a fraction of the time building it that I would have spent, had I chosen the "Microsoft Word/Google Docs" route. And the best thing was I spent absolutely no money on it!`, + }, + { + name: 'Chandani B.', + message: `Hi Amruth, Thank you for creating reactive resume and keeping it open source. I am about to use it in updating my profile and therefore wanted to express my gratitude. +As a new enthusiast with no previous background in coding, I thought it would be amazing to connect with you to learn more. Thanks`, + }, + { + name: 'Aadith R.', + message: `Hey, I just found out about Reactive Resume through a co-worker and it's damn good. Minimalist, Contains all the necessary things and is also editable.`, + }, + { + name: 'Krzysztof W.', + message: `I have just used Your CV builder to make something that jus might get me a job. Very nice website and so easy to use, perfect outcome. if i get the job i'll "buy you coffee" for sure i will recommend it to friends`, + }, + { + name: 'Bharat M.', + message: `Hi Amruth, I Just came across your open-source app, Reactive Resume while trying to search for some good resume builders online. I can't express how useful it is! I wish I found it earlier than yesterday! :D I appreciate your work. From now on, I'm gonna recommend the app to whoever I feel could make good use of it! Thank you very much for your work! I will remember this and would like to buy you coffee as soon as I can. What's better than donating for such a good cause! Thanks again. Have a great day!`, + }, + { + name: 'Shlok C.', + message: `Hey Amruth, I recently stumbled upon reactive resume and have started playing around with it. Kudos to you for building such an awesome open-source resume building tool..... Best wishes!`, + }, + { + name: 'Joao R.', + message: `Hi Amruth, Let me congratulate you on the awesome RxResume. After long and extensive searches on the internet for a good and clean CV generator, RxResume is truly a gem. I've been using it to create all my CVs.`, + }, +]; + +export default testimonials; diff --git a/client/next-i18next.config.js b/client/next-i18next.config.js index 2b286074a..707c14515 100644 --- a/client/next-i18next.config.js +++ b/client/next-i18next.config.js @@ -3,9 +3,8 @@ const path = require('path'); const i18nConfig = { i18n: { defaultLocale: 'en', - locales: ['en'], + locales: ['en', 'ta'], }, - debug: false, nsSeparator: '.', localePath: path.resolve('./public/locales'), ns: ['common', 'modals', 'landing', 'dashboard', 'builder'], diff --git a/client/package.json b/client/package.json index 6e00535a3..2fbf04d55 100644 --- a/client/package.json +++ b/client/package.json @@ -13,9 +13,9 @@ "@emotion/styled": "^11.8.1", "@hookform/resolvers": "2.8.8", "@monaco-editor/react": "^4.3.1", - "@mui/icons-material": "^5.4.4", - "@mui/lab": "^5.0.0-alpha.71", - "@mui/material": "^5.4.4", + "@mui/icons-material": "^5.5.0", + "@mui/lab": "^5.0.0-alpha.72", + "@mui/material": "^5.5.0", "@reduxjs/toolkit": "^1.8.0", "axios": "^0.26.0", "clsx": "^1.1.1", @@ -54,6 +54,7 @@ "devDependencies": { "@babel/core": "^7.17.5", "@reactive-resume/schema": "workspace:*", + "@tailwindcss/typography": "^0.5.2", "@types/downloadjs": "^1.4.3", "@types/lodash": "^4.14.179", "@types/node": "17.0.21", @@ -66,7 +67,7 @@ "autoprefixer": "^10.4.2", "eslint": "^8.10.0", "eslint-config-next": "12.1.0", - "postcss": "^8.4.7", + "postcss": "^8.4.8", "prettier": "^2.5.1", "sass": "^1.49.9", "tailwindcss": "^3.0.23", diff --git a/client/pages/index.tsx b/client/pages/index.tsx index a6c31877d..04f3c23fc 100644 --- a/client/pages/index.tsx +++ b/client/pages/index.tsx @@ -1,4 +1,5 @@ import { Link as LinkIcon } from '@mui/icons-material'; +import { Masonry } from '@mui/lab'; import { Button } from '@mui/material'; import type { GetStaticProps, NextPage } from 'next'; import Image from 'next/image'; @@ -6,10 +7,12 @@ import Link from 'next/link'; import { Trans, useTranslation } from 'next-i18next'; import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; +import Testimony from '@/components/landing/Testimony'; import Footer from '@/components/shared/Footer'; import Logo from '@/components/shared/Logo'; import NoSSR from '@/components/shared/NoSSR'; import { screenshots } from '@/config/screenshots'; +import testimonials from '@/data/testimonials'; import { logout } from '@/store/auth/authSlice'; import { useAppDispatch, useAppSelector } from '@/store/hooks'; import { setModalState } from '@/store/modal/modalSlice'; @@ -115,6 +118,31 @@ const Home: NextPage = () => { +
+
{t('landing.testimonials.heading')}
+ +

+ + Good or bad, I would love to hear your opinion on Reactive Resume and how the experience has been for you. +
+ Here are some of the messages sent in by users across the world. +
+

+ +

+ + You can reach out to me through my email or through the contact + form on my website. + +

+ + + {testimonials.map(({ name, message }, index) => ( + + ))} + +
+
{t('landing.links.heading')}
@@ -133,6 +161,12 @@ const Home: NextPage = () => {
+
+ + Powered By DigitalOcean + +
+