From ba55685c1b42a542daa01b8850355a344a9af751 Mon Sep 17 00:00:00 2001 From: Abdulmalik Yusuf <31839174+abdulmalikyusuf@users.noreply.github.com> Date: Wed, 21 Aug 2024 12:32:06 +0100 Subject: [PATCH 01/22] Fix: update permissions url & mobile responsiveness. --- src/actions/roles-and-permissions.ts | 2 +- .../create-role/page.tsx | 18 ++++- .../roles-and-permissions/page.tsx | 29 ++++--- .../roles-permissions-creation/index.tsx | 81 ++++++++++--------- 4 files changed, 77 insertions(+), 53 deletions(-) diff --git a/src/actions/roles-and-permissions.ts b/src/actions/roles-and-permissions.ts index df047dcd5..d326e26bf 100644 --- a/src/actions/roles-and-permissions.ts +++ b/src/actions/roles-and-permissions.ts @@ -154,7 +154,7 @@ export const updateRole = async ( try { const response = await axios.put( - `${apiUrl}/organisations/${currentOrgId}/roles/${roleId}`, + `${apiUrl}/api/v1/organisations/${currentOrgId}/roles/${roleId}`, payload, { headers: { diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx index b52da934e..0333ece7a 100644 --- a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx +++ b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx @@ -3,12 +3,12 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { ChevronLeftIcon } from "lucide-react"; import Link from "next/link"; +import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { createRole, getPermissions } from "~/actions/roles-and-permissions"; -import CustomButton from "~/components/common/common-button/common-button"; import RolePermissionsCreationModal from "~/components/common/modals/roles-permissions-creation"; import LoadingSpinner from "~/components/miscellaneous/loading-spinner"; import { @@ -122,6 +122,7 @@ const transformPermissions = (apiResponse: APIPermissions[]) => { }; function CreateNewRolePage() { + const router = useRouter(); const [currentOrgId] = useLocalStorage("current_orgid", ""); const [isSaving, setIsSaving] = useState(false); const [permissions, setPermissions] = useState< @@ -164,6 +165,12 @@ function CreateNewRolePage() { } }, [permissions, setValue]); + useEffect(() => { + if (permissionOptions && permissionOptions.length > 0) { + setPermissions(permissionOptions[0].permissions); + } + }, [permissionOptions]); + const onValid = async (values: UseFormInputs) => { setIsSaving(true); try { @@ -176,6 +183,7 @@ function CreateNewRolePage() { "You have successfully created the new role Role Name. You can now assign this role to team members and manage their permissions in the Roles & Permissions section.", variant: "default", }); + router.push(""); } setIsSaving(false); }) @@ -281,7 +289,11 @@ function CreateNewRolePage() { handleChange={setPermissions} permissions={permissions} /> - + diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/page.tsx index c358705d5..11d6b6349 100644 --- a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/page.tsx +++ b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/page.tsx @@ -162,9 +162,23 @@ const RolesAndPermission = () => { return (
-
-
-

Roles

+
+
+

Roles

+ + Manage user roles for members + +
+
+ + + + Create roles + + +
+
+
+
    {loadingRoles ? (
    @@ -192,14 +206,7 @@ const RolesAndPermission = () => { )}
-
-
- - - + Create roles - - -
+

diff --git a/src/components/common/modals/roles-permissions-creation/index.tsx b/src/components/common/modals/roles-permissions-creation/index.tsx index 66b82a7d9..493924c5c 100644 --- a/src/components/common/modals/roles-permissions-creation/index.tsx +++ b/src/components/common/modals/roles-permissions-creation/index.tsx @@ -2,7 +2,7 @@ import { Dispatch, SetStateAction } from "react"; -import CustomButton from "~/components/common/common-button/common-button"; +import LoadingSpinner from "~/components/miscellaneous/loading-spinner"; import { Dialog, DialogClose, @@ -51,10 +51,8 @@ function RolePreferencesCreationModal({ return ( <> - - - Add Permissions - + + Add Permissions @@ -65,41 +63,48 @@ function RolePreferencesCreationModal({ See the list of permissions for this role -
-
- {permissions.map((permission, index) => ( -
0 ? ( +
+
+ {permissions.map((permission, index) => ( +
+ + {permission.name + .replaceAll("_", " ") + .replaceAll(/\b\w/g, (l) => l.toUpperCase())} + + +
+ ))} +
+
+ - - {permission.name - .replaceAll("_", " ") - .replaceAll(/\b\w/g, (l) => l.toUpperCase())} - - -
- ))} + Done + +
-
- - Done - -
-
+ ) : ( + + )}
From 42aca0b75ed45a944e9d8bf0cc27095509713bbb Mon Sep 17 00:00:00 2001 From: Peter Abah Date: Fri, 23 Aug 2024 09:53:14 +0100 Subject: [PATCH 02/22] fix: add logo and address to footer --- src/components/layouts/footer/index.tsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/components/layouts/footer/index.tsx b/src/components/layouts/footer/index.tsx index b5de8c731..67d4de822 100644 --- a/src/components/layouts/footer/index.tsx +++ b/src/components/layouts/footer/index.tsx @@ -10,6 +10,7 @@ import { Youtube, } from "lucide-react"; import { useTranslations } from "next-intl"; +import Image from "next/image"; import Link from "next/link"; import { useState } from "react"; @@ -160,13 +161,19 @@ const Footer = () => {
-
+
-
- Boiler plate +
+ + HNG Boilerplate
-

- Logo subject details and address +

+ 10111, Hornchurch, London, United Kingdom

From e0b8c6f81eb51d69f03d560a66843a5ee4b93bd1 Mon Sep 17 00:00:00 2001 From: Muneerat Date: Fri, 23 Aug 2024 10:14:00 +0100 Subject: [PATCH 03/22] fix:signup placeholder for password --- src/app/(auth-routes)/register/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(auth-routes)/register/page.tsx b/src/app/(auth-routes)/register/page.tsx index cb38f779f..fcbf6e79d 100644 --- a/src/app/(auth-routes)/register/page.tsx +++ b/src/app/(auth-routes)/register/page.tsx @@ -305,7 +305,7 @@ const Register = () => { Date: Fri, 23 Aug 2024 13:15:12 +0100 Subject: [PATCH 04/22] fix: add router for terms and privacy in footer bottom --- src/components/layouts/footer/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/layouts/footer/index.tsx b/src/components/layouts/footer/index.tsx index b5de8c731..7de3e3e8f 100644 --- a/src/components/layouts/footer/index.tsx +++ b/src/components/layouts/footer/index.tsx @@ -150,8 +150,8 @@ const Footer = () => { ]; const footerBottom = [ - { route: "privacyPolicy", link: "/" }, - { route: "termsOfUse", link: "/" }, + { route: "privacyPolicy", link: "/privacy-policy" }, + { route: "termsOfUse", link: "/terms-and-conditions" }, ]; // From d83ee528927407d177171f6b63abc3ce8f721e25 Mon Sep 17 00:00:00 2001 From: Adufe Obanijesu <50187465+Adufe-Obanijesu@users.noreply.github.com> Date: Fri, 23 Aug 2024 13:54:50 +0000 Subject: [PATCH 05/22] fix: improve career page when there is no job available --- public/images/career/noJob.svg | 43 +++ public/messages/en.json | 382 ++++++++++---------- public/messages/es.json | 386 +++++++++++---------- public/messages/fr.json | 386 +++++++++++---------- src/app/(landing-routes)/career/Nojobs.tsx | 201 ++++++++--- 5 files changed, 786 insertions(+), 612 deletions(-) create mode 100644 public/images/career/noJob.svg diff --git a/public/images/career/noJob.svg b/public/images/career/noJob.svg new file mode 100644 index 000000000..8e902517d --- /dev/null +++ b/public/images/career/noJob.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/public/messages/en.json b/public/messages/en.json index 9b172d400..2e703f3c0 100644 --- a/public/messages/en.json +++ b/public/messages/en.json @@ -1,190 +1,196 @@ { - "navbar": { - "login": "Log in", - "register": "Get Started" - }, - "navLinks": { - "home": "Home", - "pricing": "Pricing", - "careers": "Careers" - }, - "login": { - "title": "Login", - "welcomeBack": "Welcome back, you've been missed!", - "continueWithGoogle": "Continue with Google", - "emailPlaceholder": "Enter Email Address", - "passwordPlaceholder": "Enter Password", - "rememberMe": "Remember me", - "forgotPassword": "Forgot Password?", - "loginButton": "Login", - "signInWithMagicLink": "Sign in with magic link", - "noAccount": "Don't Have An Account?", - "agree": "By logging in, you agree to the", - "and": "and", - "signUp": "Sign Up", - "termsOfService": "Terms of Service", - "privacyPolicy": "Privacy Policy", - "loggingIn": "Logging in..." - }, - "register": { - "signUp": "Sign Up", - "createAccountDesc": "Create an account to get started with us.", - "continueWithGoogle": "Continue with Google", - "firstName": "First Name", - "firstNamePlaceholder": "Enter your first name", - "lastName": "Last Name", - "lastNamePlaceholder": "Enter your last name", - "email": "Email", - "emailPlaceholder": "Enter Email Address", - "password": "Password", - "passwordPlaceholder": "Enter Password", - "createAccount": "Create Account", - "loggingIn": "Logging in...", - "emailVerification": "Email Verification", - "emailVerificationDesc": "We have sent a code to your email {email}", - "checkSpam": "check your spam if you do not receive the email", - "otpExpiresIn": "OTP expires in: {timeLeft}", - "resendCode": "Didn't receive the code? resend", - "dataProcessing": "We would process your data as set forth in our Terms of Use, Privacy Policy and Data Processing Agreement", - "alreadyHaveAccount": "Already Have An Account? Login" - }, - "HomePage": { - "title": "Hello world!" - }, - "hero": { - "headline": "Focus on What Matters. We've Got the Foundation Covered.", - "description": "Streamline your processes with a boilerplate built for efficiency and optimal productivity.", - "cta": "Get Started" - }, - "userSection": { - "userSectionMoreThan": "More than 200", - "userSectionUsers": "Users", - "userSectionUsage": "make use of our Boilerplate" - }, - "howItWorks": { - "howItWorksTitlePrefix": "How It Works:", - "howItWorksTitleHighlight": "Experience the benefits of using our product with every step.", - "howItWorksDescription": "We designed our product to simplify your life. It offers a comprehensive solution. Here's how it works and how it benefits you at each stage.", - "prebuiltTitle": "Pre-Built Sections", - "prebuiltDescription": "Leverage pre-built sections like \"Features,\" \"Benefits,\" \"Pricing,\" and \"Testimonials\" to showcase your product effectively.", - "scalableTitle": "Scalable Foundation", - "scalableDescription": "Our boilerplate is designed to grow with your product. Easily add new features and functionalities as needed.", - "easyTitle": "Easy Customization", - "easyDescription": "Tailor the experience to your specific needs and preferences for maximum results." - }, - "testimonials": { - "title": "Client Testimonials", - "description": "Don't just take our word for it - see what actual users of our product have to say about their experience.", - "content": "I've been using this web hosting service for over a year and I'm really impressed with the uptime and support. The website has never gone down and the customer service is always quick to help with any issues I have. Highly recommend!" - }, - "perfectFit": { - "title": "Find The Perfect Fit", - "description": "Choose the boilerplate plan that best suits your project needs and budget. All plans include access to our comprehensive library of pre-built sections, drag-and-drop customization.", - "cta": "See Our Pricing Plan" - }, - "footer": { - "newsletterSignUp": "Sign Up For Newsletters", - "subscribe": "Subscribe", - "navigation": "Navigation", - "support": "Support", - "legal": "Legal", - "followUs": "Follow Us", - "privacyPolicy": "Privacy Policy", - "termsOfUse": "Terms of Use", - "enterYourEmail": "Enter your email", - "links": { - "navigation": "Navigation", - "home": "Home", - "aboutUs": "About Us", - "career": "Career", - "features": "Features", - "blog": "Blog", - "status": "Status", - "support": "Support", - "helpCenter": "Help Center", - "faq": "FAQ", - "waitingList": "Waiting List", - "pricingExperience": "Pricing Experience", - "contactUs": "Contact Us", - "legal": "Legal", - "privacyPolicy": "Privacy Policy", - "termsAndConditions": "Terms and Conditions" - }, - "social": { - "facebook": "Facebook", - "instagram": "Instagram", - "linkedin": "LinkedIn", - "youtube": "YouTube" - }, - "footerBottom": { - "privacyPolicy": "Privacy Policy", - "termsOfUse": "Terms of Use", - "copyright": "2024 All Rights Reserved" - } - }, - "pricing": { - "pricingTitle": "Simple and {{Affordable}} Pricing Plan", - "pricingContent": "Our flexible plans are designed to scale with your business. We have a plan for you.", - "monthly": "Monthly", - "annual": "Annual (save 20%)", - "billingPlansNotAvailable": "Billing plans not available", - "features": { - "feature1": "2 Projects", - "feature2": "Up to 100 subscribers", - "feature3": "Basic analytics", - "feature4": "24-hour support response time", - "feature5": "Marketing advisor", - "feature6": "Custom integration", - "continue": "Continue" - }, - "essentials": "The essentials to provide your best work for clients.", - "faqHeader": "Frequently Asked Questions", - "faqSubHeader": "We couldn’t answer your question?", - "contactUs": "Contact us", - "continue": "Continue" - }, - "faq": { - "question1": "What is the purpose of this application?", - "answer1": "This application is designed to help users manage their tasks efficiently by providing tools for scheduling, tracking progress, and setting reminders.", - "question2": "How do I reset my password?", - "answer2": "To reset your password, go to the login page and click on the 'Forgot Password' link. Follow the instructions to receive a password reset email and create a new password.", - "question3": "Can I use this application on multiple devices?", - "answer3": "Yes, the application is accessible from multiple devices including desktops, tablets, and smartphones. Your data will be synced across all devices, ensuring a seamless experience." - }, - "noJobs": { - "noJobsTitle": "No available Jobs at the moment", - "noJobsContent": "Come back later!" - }, - "ourServices": { - "title": "Our Services", - "description": "Trained to Give You The Best", - "details": "Since our founding in, Hng Boilerplate has been dedicated to constantly evolving to stay ahead of the curve. Our agile mindset and relentless pursuit of innovation ensure that you're always equipped with the most effective tools and strategies." - }, - "mission": { - "title": "Our Mission & Vision", - "subtitle": "Leading the Way, Redefining Industries", - "description": "At Hng Boilerplate, we are dedicated to exceeding your expectations. We strive to understand your unique needs and challenges, providing tailored solutions that drive real results and empower your success." - }, - "coreValues": { - "title": "Our Core Values", - "description": "Our Values shape the core of our organization and define the character of our industry.", - "values": { - "integrity": { - "title": "Integrity", - "description": "We uphold the highest ethical standards in everything we do, fostering trust and transparency with our clients, partners, and employees. We believe that honesty and integrity are the foundation of lasting success." - }, - "customerCentricity": { - "title": "Customer Centricity", - "description": "Our customers are at the heart of our business. We strive to understand their needs, exceed their expectations, and build lasting relationships based on trust and mutual respect. We believe that putting our customers first is the key to long-term success." - }, - "innovation": { - "title": "Innovation", - "description": "We embrace a culture of continuous improvement and creativity, constantly seeking new ways to evolve and enhance our products, services, and processes. We encourage experimentation and risk-taking, recognizing that innovation is essential for growth." - }, - "excellence": { - "title": "Excellence", - "description": "We are committed to delivering exceptional quality in everything we do, from our products and services to our customer interactions and internal processes. We strive for continuous improvement and hold ourselves to the highest standards of performance." - } - } + "navbar": { + "login": "Log in", + "register": "Get Started" + }, + "navLinks": { + "home": "Home", + "pricing": "Pricing", + "careers": "Careers" + }, + "login": { + "title": "Login", + "welcomeBack": "Welcome back, you've been missed!", + "continueWithGoogle": "Continue with Google", + "emailPlaceholder": "Enter Email Address", + "passwordPlaceholder": "Enter Password", + "rememberMe": "Remember me", + "forgotPassword": "Forgot Password?", + "loginButton": "Login", + "signInWithMagicLink": "Sign in with magic link", + "noAccount": "Don't Have An Account?", + "agree": "By logging in, you agree to the", + "and": "and", + "signUp": "Sign Up", + "termsOfService": "Terms of Service", + "privacyPolicy": "Privacy Policy", + "loggingIn": "Logging in..." + }, + "register": { + "signUp": "Sign Up", + "createAccountDesc": "Create an account to get started with us.", + "continueWithGoogle": "Continue with Google", + "firstName": "First Name", + "firstNamePlaceholder": "Enter your first name", + "lastName": "Last Name", + "lastNamePlaceholder": "Enter your last name", + "email": "Email", + "emailPlaceholder": "Enter Email Address", + "password": "Password", + "passwordPlaceholder": "Enter Password", + "createAccount": "Create Account", + "loggingIn": "Logging in...", + "emailVerification": "Email Verification", + "emailVerificationDesc": "We have sent a code to your email {email}", + "checkSpam": "check your spam if you do not receive the email", + "otpExpiresIn": "OTP expires in: {timeLeft}", + "resendCode": "Didn't receive the code? resend", + "dataProcessing": "We would process your data as set forth in our Terms of Use, Privacy Policy and Data Processing Agreement", + "alreadyHaveAccount": "Already Have An Account? Login" + }, + "HomePage": { + "title": "Hello world!" + }, + "hero": { + "headline": "Focus on What Matters. We've Got the Foundation Covered.", + "description": "Streamline your processes with a boilerplate built for efficiency and optimal productivity.", + "cta": "Get Started" + }, + "userSection": { + "userSectionMoreThan": "More than 200", + "userSectionUsers": "Users", + "userSectionUsage": "make use of our Boilerplate" + }, + "howItWorks": { + "howItWorksTitlePrefix": "How It Works:", + "howItWorksTitleHighlight": "Experience the benefits of using our product with every step.", + "howItWorksDescription": "We designed our product to simplify your life. It offers a comprehensive solution. Here's how it works and how it benefits you at each stage.", + "prebuiltTitle": "Pre-Built Sections", + "prebuiltDescription": "Leverage pre-built sections like \"Features,\" \"Benefits,\" \"Pricing,\" and \"Testimonials\" to showcase your product effectively.", + "scalableTitle": "Scalable Foundation", + "scalableDescription": "Our boilerplate is designed to grow with your product. Easily add new features and functionalities as needed.", + "easyTitle": "Easy Customization", + "easyDescription": "Tailor the experience to your specific needs and preferences for maximum results." + }, + "testimonials": { + "title": "Client Testimonials", + "description": "Don't just take our word for it - see what actual users of our product have to say about their experience.", + "content": "I've been using this web hosting service for over a year and I'm really impressed with the uptime and support. The website has never gone down and the customer service is always quick to help with any issues I have. Highly recommend!" + }, + "perfectFit": { + "title": "Find The Perfect Fit", + "description": "Choose the boilerplate plan that best suits your project needs and budget. All plans include access to our comprehensive library of pre-built sections, drag-and-drop customization.", + "cta": "See Our Pricing Plan" + }, + "footer": { + "newsletterSignUp": "Sign Up For Newsletters", + "subscribe": "Subscribe", + "navigation": "Navigation", + "support": "Support", + "legal": "Legal", + "followUs": "Follow Us", + "privacyPolicy": "Privacy Policy", + "termsOfUse": "Terms of Use", + "enterYourEmail": "Enter your email", + "links": { + "navigation": "Navigation", + "home": "Home", + "aboutUs": "About Us", + "career": "Career", + "features": "Features", + "blog": "Blog", + "status": "Status", + "support": "Support", + "helpCenter": "Help Center", + "faq": "FAQ", + "waitingList": "Waiting List", + "pricingExperience": "Pricing Experience", + "contactUs": "Contact Us", + "legal": "Legal", + "privacyPolicy": "Privacy Policy", + "termsAndConditions": "Terms and Conditions" + }, + "social": { + "facebook": "Facebook", + "instagram": "Instagram", + "linkedin": "LinkedIn", + "youtube": "YouTube" + }, + "footerBottom": { + "privacyPolicy": "Privacy Policy", + "termsOfUse": "Terms of Use", + "copyright": "2024 All Rights Reserved" + } + }, + "pricing": { + "pricingTitle": "Simple and {{Affordable}} Pricing Plan", + "pricingContent": "Our flexible plans are designed to scale with your business. We have a plan for you.", + "monthly": "Monthly", + "annual": "Annual (save 20%)", + "billingPlansNotAvailable": "Billing plans not available", + "features": { + "feature1": "2 Projects", + "feature2": "Up to 100 subscribers", + "feature3": "Basic analytics", + "feature4": "24-hour support response time", + "feature5": "Marketing advisor", + "feature6": "Custom integration", + "continue": "Continue" + }, + "essentials": "The essentials to provide your best work for clients.", + "faqHeader": "Frequently Asked Questions", + "faqSubHeader": "We couldn’t answer your question?", + "contactUs": "Contact us", + "continue": "Continue" + }, + "faq": { + "question1": "What is the purpose of this application?", + "answer1": "This application is designed to help users manage their tasks efficiently by providing tools for scheduling, tracking progress, and setting reminders.", + "question2": "How do I reset my password?", + "answer2": "To reset your password, go to the login page and click on the 'Forgot Password' link. Follow the instructions to receive a password reset email and create a new password.", + "question3": "Can I use this application on multiple devices?", + "answer3": "Yes, the application is accessible from multiple devices including desktops, tablets, and smartphones. Your data will be synced across all devices, ensuring a seamless experience." + }, + "noJobs": { + "noJobsTitle": "No available Jobs at the moment", + "noJobsContent": "Sign up for our newsletter to get updates on job postings", + "modalTitle": "Newsletter", + "button": "Sign up for newsletter", + "placeholder": "Enter your email", + "modalButton": "Subscribe", + "error": "Please provide your email", + "subscribed": "Thank you for subscribing" + }, + "ourServices": { + "title": "Our Services", + "description": "Trained to Give You The Best", + "details": "Since our founding in, Hng Boilerplate has been dedicated to constantly evolving to stay ahead of the curve. Our agile mindset and relentless pursuit of innovation ensure that you're always equipped with the most effective tools and strategies." + }, + "mission": { + "title": "Our Mission & Vision", + "subtitle": "Leading the Way, Redefining Industries", + "description": "At Hng Boilerplate, we are dedicated to exceeding your expectations. We strive to understand your unique needs and challenges, providing tailored solutions that drive real results and empower your success." + }, + "coreValues": { + "title": "Our Core Values", + "description": "Our Values shape the core of our organization and define the character of our industry.", + "values": { + "integrity": { + "title": "Integrity", + "description": "We uphold the highest ethical standards in everything we do, fostering trust and transparency with our clients, partners, and employees. We believe that honesty and integrity are the foundation of lasting success." + }, + "customerCentricity": { + "title": "Customer Centricity", + "description": "Our customers are at the heart of our business. We strive to understand their needs, exceed their expectations, and build lasting relationships based on trust and mutual respect. We believe that putting our customers first is the key to long-term success." + }, + "innovation": { + "title": "Innovation", + "description": "We embrace a culture of continuous improvement and creativity, constantly seeking new ways to evolve and enhance our products, services, and processes. We encourage experimentation and risk-taking, recognizing that innovation is essential for growth." + }, + "excellence": { + "title": "Excellence", + "description": "We are committed to delivering exceptional quality in everything we do, from our products and services to our customer interactions and internal processes. We strive for continuous improvement and hold ourselves to the highest standards of performance." + } } -} \ No newline at end of file + } +} diff --git a/public/messages/es.json b/public/messages/es.json index 677278367..4688e87b0 100644 --- a/public/messages/es.json +++ b/public/messages/es.json @@ -1,192 +1,198 @@ { - "navbar": { - "login": "Iniciar sesión", - "register": "Comenzar" - }, - "navLinks": { - "home": "Inicio", - "pricing": "Precios", - "careers": "Carreras" - }, - "login": { - "title": "Iniciar sesión", - "welcomeBack": "¡Bienvenido de nuevo, te hemos extrañado!", - "continueWithGoogle": "Continuar con Google", - "emailPlaceholder": "Ingrese dirección de correo electrónico", - "passwordPlaceholder": "Ingrese contraseña", - "rememberMe": "Recuérdame", - "forgotPassword": "¿Olvidaste tu contraseña?", - "loginButton": "Iniciar sesión", - "signInWithMagicLink": "Iniciar sesión con enlace mágico", - "noAccount": "¿No tienes una cuenta?", - "agree": "Al iniciar sesión, aceptas los", - "and": "y", - "signUp": "Regístrate", - "termsOfService": "Términos del Servicio", - "privacyPolicy": "Política de Privacidad", - "loggingIn": "Iniciando sesión..." - }, - "register": { - "signUp": "Regístrate", - "createAccountDesc": "Crea una cuenta para comenzar con nosotros.", - "continueWithGoogle": "Continuar con Google", - "firstName": "Nombre", - "firstNamePlaceholder": "Ingresa tu nombre", - "lastName": "Apellido", - "lastNamePlaceholder": "Ingresa tu apellido", - "email": "Correo electrónico", - "emailPlaceholder": "Ingresa la dirección de correo", - "password": "Contraseña", - "passwordPlaceholder": "Ingresa la contraseña", - "createAccount": "Crear cuenta", - "loggingIn": "Iniciando sesión...", - "emailVerification": "Verificación de correo electrónico", - "emailVerificationDesc": "Hemos enviado un código a tu correo {email}", - "checkSpam": "verifica tu spam si no recibes el correo", - "otpExpiresIn": "OTP expira en: {timeLeft}", - "resendCode": "¿No recibiste el código? reenviar", - "dataProcessing": "Procesaremos tus datos según lo establecido en nuestros Términos de uso, Política de privacidad y Acuerdo de procesamiento de datos", - "alreadyHaveAccount": "¿Ya tienes una cuenta? Iniciar sesión" - }, - "HomePage": { - "title": "¡Hola, mundo!" - }, - "hero": { - "headline": "Concéntrate en lo importante. Nosotros cubrimos los cimientos.", - "description": "Agiliza tus procesos con una base de código diseñada para la eficiencia y una productividad óptima.", - "cta": "Comenzar" - }, - "userSection": { - "userSectionMoreThan": "Más de 200", - "userSectionUsers": "Usuarios", - "userSectionUsage": "usan nuestro Boilerplate" - }, - "howItWorks": { - "howItWorksTitlePrefix": "Cómo Funciona:", - "howItWorksTitleHighlight": "Experimenta los beneficios de usar nuestro producto en cada paso.", - "howItWorksDescription": "Diseñamos nuestro producto para simplificar tu vida. Ofrece una solución integral. Así es como funciona y cómo te beneficia en cada etapa.", - "prebuiltTitle": "Secciones Preconstruidas", - "prebuiltDescription": "Aprovecha secciones preconstruidas como \"Características\", \"Beneficios\", \"Precios\" y \"Testimonios\" para mostrar tu producto de manera efectiva.", - "scalableTitle": "Fundación Escalable", - "scalableDescription": "Nuestro boilerplate está diseñado para crecer con tu producto. Añade fácilmente nuevas características y funcionalidades según sea necesario.", - "easyTitle": "Personalización Fácil", - "easyDescription": "Personaliza la experiencia según tus necesidades y preferencias específicas para obtener resultados óptimos." - }, - "testimonials": { - "title": "Testimonios de Clientes", - "description": "No te fíes solo de nuestra palabra: descubre lo que los usuarios reales de nuestro producto tienen que decir sobre su experiencia.", - "content": "He estado usando este servicio de alojamiento web durante más de un año y estoy realmente impresionado con el tiempo de actividad y el soporte. El sitio web nunca ha caído y el servicio al cliente siempre es rápido para ayudar con cualquier problema que tenga. ¡Altamente recomendado!" - }, - "perfectFit": { - "title": "Encuentra la Solución Perfecta", - "description": "Elige el plan de plantilla que mejor se adapte a las necesidades y presupuesto de tu proyecto. Todos los planes incluyen acceso a nuestra biblioteca completa de secciones preconstruidas y personalización mediante arrastrar y soltar.", - "cta": "Consulta Nuestro Plan de Precios" - }, - "footer": { - "boilerplate": "Plantilla", - "address": "Detalles del logo y dirección", - "newsletterSignUp": "Suscríbete al Boletín", - "subscribe": "Suscribirse", - "navigation": "Navegación", - "support": "Soporte", - "legal": "Legal", - "followUs": "Síguenos", - "privacyPolicy": "Política de Privacidad", - "termsOfUse": "Términos de Uso", - "enterYourEmail": "Introduce tu correo electrónico", - "links": { - "navigation": "Navegación", - "home": "Inicio", - "aboutUs": "Sobre Nosotros", - "career": "Carrera", - "features": "Características", - "blog": "Blog", - "status": "Estado", - "support": "Soporte", - "helpCenter": "Centro de Ayuda", - "faq": "FAQ", - "waitingList": "Lista de Espera", - "pricingExperience": "Experiencia de Precios", - "contactUs": "Contáctanos", - "legal": "Legal", - "privacyPolicy": "Política de Privacidad", - "termsAndConditions": "Términos y Condiciones" - }, - "social": { - "facebook": "Facebook", - "instagram": "Instagram", - "linkedin": "LinkedIn", - "youtube": "YouTube" - }, - "footerBottom": { - "privacyPolicy": "Política de Privacidad", - "termsOfUse": "Términos de Uso", - "copyright": "2024 Todos los Derechos Reservados" - } - }, - "pricing": { - "pricingTitle": "Plan de Precios Simple y {{Asequible}}", - "pricingContent": "Nuestros planes flexibles están diseñados para adaptarse a su negocio. Tenemos un plan para usted.", - "monthly": "Mensual", - "annual": "Anual (ahorra un 20%)", - "billingPlansNotAvailable": "Planes de facturación no disponibles", - "features": { - "feature1": "2 Proyectos", - "feature2": "Hasta 100 suscriptores", - "feature3": "Análisis básico", - "feature4": "Tiempo de respuesta de soporte de 24 horas", - "feature5": "Asesor de marketing", - "feature6": "Integración personalizada", - "continue": "Continuar" - }, - "essentials": "Los elementos esenciales para ofrecer tu mejor trabajo a los clientes.", - "faqHeader": "Preguntas Frecuentes", - "faqSubHeader": "¿No pudimos responder a su pregunta?", - "contactUs": "Contáctanos", - "continue": "Continuar" - }, - "faq": { - "question1": "¿Cuál es el propósito de esta aplicación?", - "answer1": "Esta aplicación está diseñada para ayudar a los usuarios a gestionar sus tareas de manera eficiente proporcionando herramientas para la programación, el seguimiento del progreso y el establecimiento de recordatorios.", - "question2": "¿Cómo restablezco mi contraseña?", - "answer2": "Para restablecer tu contraseña, ve a la página de inicio de sesión y haz clic en el enlace 'Olvidé mi contraseña'. Sigue las instrucciones para recibir un correo electrónico de restablecimiento de contraseña y crear una nueva contraseña.", - "question3": "¿Puedo usar esta aplicación en varios dispositivos?", - "answer3": "Sí, la aplicación es accesible desde múltiples dispositivos, incluidos escritorios, tabletas y teléfonos inteligentes. Tus datos se sincronizarán en todos los dispositivos, garantizando una experiencia fluida." - }, - "noJobs": { - "noJobsTitle": "No hay trabajos disponibles en este momento", - "noJobsContent": "¡Vuelve más tarde!" - }, - "ourServices": { - "title": "Nuestros Servicios", - "description": "Capacitados para Ofrecerte Lo Mejor", - "details": "Desde nuestra fundación, Hng Boilerplate se ha dedicado a evolucionar constantemente para mantenerse a la vanguardia. Nuestra mentalidad ágil y nuestra búsqueda incesante de innovación garantizan que siempre estés equipado con las herramientas y estrategias más efectivas." - }, - "mission": { - "title": "Nuestra Misión y Visión", - "subtitle": "Liderando el Camino, Redefiniendo Industrias", - "description": "En Hng Boilerplate, estamos dedicados a superar tus expectativas. Nos esforzamos por entender tus necesidades y desafíos únicos, proporcionando soluciones personalizadas que generan resultados reales y potencian tu éxito." - }, - "coreValues": { - "title": "Nuestros Valores Fundamentales", - "description": "Nuestros Valores forman el núcleo de nuestra organización y definen el carácter de nuestra industria.", - "values": { - "integrity": { - "title": "Integridad", - "description": "Mantenemos los más altos estándares éticos en todo lo que hacemos, fomentando la confianza y la transparencia con nuestros clientes, socios y empleados. Creemos que la honestidad y la integridad son la base del éxito duradero." - }, - "customerCentricity": { - "title": "Enfoque en el Cliente", - "description": "Nuestros clientes están en el corazón de nuestro negocio. Nos esforzamos por entender sus necesidades, superar sus expectativas y construir relaciones duraderas basadas en la confianza y el respeto mutuo. Creemos que poner a nuestros clientes en primer lugar es la clave para el éxito a largo plazo." - }, - "innovation": { - "title": "Innovación", - "description": "Adoptamos una cultura de mejora continua y creatividad, buscando constantemente nuevas formas de evolucionar y mejorar nuestros productos, servicios y procesos. Fomentamos la experimentación y la toma de riesgos, reconociendo que la innovación es esencial para el crecimiento." - }, - "excellence": { - "title": "Excelencia", - "description": "Estamos comprometidos a ofrecer una calidad excepcional en todo lo que hacemos, desde nuestros productos y servicios hasta nuestras interacciones con los clientes y procesos internos. Buscamos la mejora continua y nos mantenemos a los más altos estándares de desempeño." - } - } + "navbar": { + "login": "Iniciar sesión", + "register": "Comenzar" + }, + "navLinks": { + "home": "Inicio", + "pricing": "Precios", + "careers": "Carreras" + }, + "login": { + "title": "Iniciar sesión", + "welcomeBack": "¡Bienvenido de nuevo, te hemos extrañado!", + "continueWithGoogle": "Continuar con Google", + "emailPlaceholder": "Ingrese dirección de correo electrónico", + "passwordPlaceholder": "Ingrese contraseña", + "rememberMe": "Recuérdame", + "forgotPassword": "¿Olvidaste tu contraseña?", + "loginButton": "Iniciar sesión", + "signInWithMagicLink": "Iniciar sesión con enlace mágico", + "noAccount": "¿No tienes una cuenta?", + "agree": "Al iniciar sesión, aceptas los", + "and": "y", + "signUp": "Regístrate", + "termsOfService": "Términos del Servicio", + "privacyPolicy": "Política de Privacidad", + "loggingIn": "Iniciando sesión..." + }, + "register": { + "signUp": "Regístrate", + "createAccountDesc": "Crea una cuenta para comenzar con nosotros.", + "continueWithGoogle": "Continuar con Google", + "firstName": "Nombre", + "firstNamePlaceholder": "Ingresa tu nombre", + "lastName": "Apellido", + "lastNamePlaceholder": "Ingresa tu apellido", + "email": "Correo electrónico", + "emailPlaceholder": "Ingresa la dirección de correo", + "password": "Contraseña", + "passwordPlaceholder": "Ingresa la contraseña", + "createAccount": "Crear cuenta", + "loggingIn": "Iniciando sesión...", + "emailVerification": "Verificación de correo electrónico", + "emailVerificationDesc": "Hemos enviado un código a tu correo {email}", + "checkSpam": "verifica tu spam si no recibes el correo", + "otpExpiresIn": "OTP expira en: {timeLeft}", + "resendCode": "¿No recibiste el código? reenviar", + "dataProcessing": "Procesaremos tus datos según lo establecido en nuestros Términos de uso, Política de privacidad y Acuerdo de procesamiento de datos", + "alreadyHaveAccount": "¿Ya tienes una cuenta? Iniciar sesión" + }, + "HomePage": { + "title": "¡Hola, mundo!" + }, + "hero": { + "headline": "Concéntrate en lo importante. Nosotros cubrimos los cimientos.", + "description": "Agiliza tus procesos con una base de código diseñada para la eficiencia y una productividad óptima.", + "cta": "Comenzar" + }, + "userSection": { + "userSectionMoreThan": "Más de 200", + "userSectionUsers": "Usuarios", + "userSectionUsage": "usan nuestro Boilerplate" + }, + "howItWorks": { + "howItWorksTitlePrefix": "Cómo Funciona:", + "howItWorksTitleHighlight": "Experimenta los beneficios de usar nuestro producto en cada paso.", + "howItWorksDescription": "Diseñamos nuestro producto para simplificar tu vida. Ofrece una solución integral. Así es como funciona y cómo te beneficia en cada etapa.", + "prebuiltTitle": "Secciones Preconstruidas", + "prebuiltDescription": "Aprovecha secciones preconstruidas como \"Características\", \"Beneficios\", \"Precios\" y \"Testimonios\" para mostrar tu producto de manera efectiva.", + "scalableTitle": "Fundación Escalable", + "scalableDescription": "Nuestro boilerplate está diseñado para crecer con tu producto. Añade fácilmente nuevas características y funcionalidades según sea necesario.", + "easyTitle": "Personalización Fácil", + "easyDescription": "Personaliza la experiencia según tus necesidades y preferencias específicas para obtener resultados óptimos." + }, + "testimonials": { + "title": "Testimonios de Clientes", + "description": "No te fíes solo de nuestra palabra: descubre lo que los usuarios reales de nuestro producto tienen que decir sobre su experiencia.", + "content": "He estado usando este servicio de alojamiento web durante más de un año y estoy realmente impresionado con el tiempo de actividad y el soporte. El sitio web nunca ha caído y el servicio al cliente siempre es rápido para ayudar con cualquier problema que tenga. ¡Altamente recomendado!" + }, + "perfectFit": { + "title": "Encuentra la Solución Perfecta", + "description": "Elige el plan de plantilla que mejor se adapte a las necesidades y presupuesto de tu proyecto. Todos los planes incluyen acceso a nuestra biblioteca completa de secciones preconstruidas y personalización mediante arrastrar y soltar.", + "cta": "Consulta Nuestro Plan de Precios" + }, + "footer": { + "boilerplate": "Plantilla", + "address": "Detalles del logo y dirección", + "newsletterSignUp": "Suscríbete al Boletín", + "subscribe": "Suscribirse", + "navigation": "Navegación", + "support": "Soporte", + "legal": "Legal", + "followUs": "Síguenos", + "privacyPolicy": "Política de Privacidad", + "termsOfUse": "Términos de Uso", + "enterYourEmail": "Introduce tu correo electrónico", + "links": { + "navigation": "Navegación", + "home": "Inicio", + "aboutUs": "Sobre Nosotros", + "career": "Carrera", + "features": "Características", + "blog": "Blog", + "status": "Estado", + "support": "Soporte", + "helpCenter": "Centro de Ayuda", + "faq": "FAQ", + "waitingList": "Lista de Espera", + "pricingExperience": "Experiencia de Precios", + "contactUs": "Contáctanos", + "legal": "Legal", + "privacyPolicy": "Política de Privacidad", + "termsAndConditions": "Términos y Condiciones" + }, + "social": { + "facebook": "Facebook", + "instagram": "Instagram", + "linkedin": "LinkedIn", + "youtube": "YouTube" + }, + "footerBottom": { + "privacyPolicy": "Política de Privacidad", + "termsOfUse": "Términos de Uso", + "copyright": "2024 Todos los Derechos Reservados" + } + }, + "pricing": { + "pricingTitle": "Plan de Precios Simple y {{Asequible}}", + "pricingContent": "Nuestros planes flexibles están diseñados para adaptarse a su negocio. Tenemos un plan para usted.", + "monthly": "Mensual", + "annual": "Anual (ahorra un 20%)", + "billingPlansNotAvailable": "Planes de facturación no disponibles", + "features": { + "feature1": "2 Proyectos", + "feature2": "Hasta 100 suscriptores", + "feature3": "Análisis básico", + "feature4": "Tiempo de respuesta de soporte de 24 horas", + "feature5": "Asesor de marketing", + "feature6": "Integración personalizada", + "continue": "Continuar" + }, + "essentials": "Los elementos esenciales para ofrecer tu mejor trabajo a los clientes.", + "faqHeader": "Preguntas Frecuentes", + "faqSubHeader": "¿No pudimos responder a su pregunta?", + "contactUs": "Contáctanos", + "continue": "Continuar" + }, + "faq": { + "question1": "¿Cuál es el propósito de esta aplicación?", + "answer1": "Esta aplicación está diseñada para ayudar a los usuarios a gestionar sus tareas de manera eficiente proporcionando herramientas para la programación, el seguimiento del progreso y el establecimiento de recordatorios.", + "question2": "¿Cómo restablezco mi contraseña?", + "answer2": "Para restablecer tu contraseña, ve a la página de inicio de sesión y haz clic en el enlace 'Olvidé mi contraseña'. Sigue las instrucciones para recibir un correo electrónico de restablecimiento de contraseña y crear una nueva contraseña.", + "question3": "¿Puedo usar esta aplicación en varios dispositivos?", + "answer3": "Sí, la aplicación es accesible desde múltiples dispositivos, incluidos escritorios, tabletas y teléfonos inteligentes. Tus datos se sincronizarán en todos los dispositivos, garantizando una experiencia fluida." + }, + "noJobs": { + "noJobsTitle": "No hay trabajos disponibles en este momento", + "noJobsContent": "Regístrate en nuestro boletín para recibir actualizaciones sobre ofertas de trabajo.", + "modalTitle": "Boletín", + "button": "Regístrate en el boletín", + "placeholder": "Por favor, proporciona tu correo electrónico", + "modalButton": "Suscribirse", + "error": "Ingresa tu correo electrónico", + "subscribed": "Gracias por suscribirte" + }, + "ourServices": { + "title": "Nuestros Servicios", + "description": "Capacitados para Ofrecerte Lo Mejor", + "details": "Desde nuestra fundación, Hng Boilerplate se ha dedicado a evolucionar constantemente para mantenerse a la vanguardia. Nuestra mentalidad ágil y nuestra búsqueda incesante de innovación garantizan que siempre estés equipado con las herramientas y estrategias más efectivas." + }, + "mission": { + "title": "Nuestra Misión y Visión", + "subtitle": "Liderando el Camino, Redefiniendo Industrias", + "description": "En Hng Boilerplate, estamos dedicados a superar tus expectativas. Nos esforzamos por entender tus necesidades y desafíos únicos, proporcionando soluciones personalizadas que generan resultados reales y potencian tu éxito." + }, + "coreValues": { + "title": "Nuestros Valores Fundamentales", + "description": "Nuestros Valores forman el núcleo de nuestra organización y definen el carácter de nuestra industria.", + "values": { + "integrity": { + "title": "Integridad", + "description": "Mantenemos los más altos estándares éticos en todo lo que hacemos, fomentando la confianza y la transparencia con nuestros clientes, socios y empleados. Creemos que la honestidad y la integridad son la base del éxito duradero." + }, + "customerCentricity": { + "title": "Enfoque en el Cliente", + "description": "Nuestros clientes están en el corazón de nuestro negocio. Nos esforzamos por entender sus necesidades, superar sus expectativas y construir relaciones duraderas basadas en la confianza y el respeto mutuo. Creemos que poner a nuestros clientes en primer lugar es la clave para el éxito a largo plazo." + }, + "innovation": { + "title": "Innovación", + "description": "Adoptamos una cultura de mejora continua y creatividad, buscando constantemente nuevas formas de evolucionar y mejorar nuestros productos, servicios y procesos. Fomentamos la experimentación y la toma de riesgos, reconociendo que la innovación es esencial para el crecimiento." + }, + "excellence": { + "title": "Excelencia", + "description": "Estamos comprometidos a ofrecer una calidad excepcional en todo lo que hacemos, desde nuestros productos y servicios hasta nuestras interacciones con los clientes y procesos internos. Buscamos la mejora continua y nos mantenemos a los más altos estándares de desempeño." + } } -} \ No newline at end of file + } +} diff --git a/public/messages/fr.json b/public/messages/fr.json index c87c73a6e..559fc7368 100644 --- a/public/messages/fr.json +++ b/public/messages/fr.json @@ -1,192 +1,198 @@ { - "navbar": { - "login": "Se connecter", - "register": "Commencer" - }, - "navLinks": { - "home": "Accueil", - "pricing": "Tarification", - "careers": "Carrières" - }, - "login": { - "title": "Connexion", - "welcomeBack": "Bon retour, tu nous as manqué !", - "continueWithGoogle": "Continuer avec Google", - "emailPlaceholder": "Entrez l'adresse e-mail", - "passwordPlaceholder": "Entrez le mot de passe", - "rememberMe": "Se souvenir de moi", - "forgotPassword": "Mot de passe oublié ?", - "loginButton": "Connexion", - "signInWithMagicLink": "Se connecter avec un lien magique", - "noAccount": "Vous n'avez pas de compte ?", - "agree": "En vous connectant, vous acceptez les", - "and": "et", - "signUp": "S'inscrire", - "termsOfService": "Conditions d'utilisation", - "privacyPolicy": "Politique de confidentialité", - "loggingIn": "Connexion en cours..." - }, - "register": { - "signUp": "S'inscrire", - "createAccountDesc": "Créez un compte pour commencer avec nous.", - "continueWithGoogle": "Continuer avec Google", - "firstName": "Prénom", - "firstNamePlaceholder": "Entrez votre prénom", - "lastName": "Nom", - "lastNamePlaceholder": "Entrez votre nom", - "email": "Email", - "emailPlaceholder": "Entrez l'adresse email", - "password": "Mot de passe", - "passwordPlaceholder": "Entrez le mot de passe", - "createAccount": "Créer un compte", - "loggingIn": "Connexion en cours...", - "emailVerification": "Vérification de l'email", - "emailVerificationDesc": "Nous avons envoyé un code à votre email {email}", - "checkSpam": "vérifiez votre spam si vous ne recevez pas l'email", - "otpExpiresIn": "OTP expire dans : {timeLeft}", - "resendCode": "Vous n'avez pas reçu le code ? renvoyez", - "dataProcessing": "Nous traiterons vos données comme indiqué dans nos Conditions d'utilisation, Politique de confidentialité et Accord de traitement des données", - "alreadyHaveAccount": "Vous avez déjà un compte ? Connexion" - }, - "HomePage": { - "title": "Bonjour le monde !" - }, - "hero": { - "headline": "Concentrez-vous sur l'essentiel. Nous avons la base.", - "description": "Rationalisez vos processus avec une base de code conçue pour l'efficacité et une productivité optimale.", - "cta": "Commencer" - }, - "userSection": { - "userSectionMoreThan": "Plus de 200", - "userSectionUsers": "Utilisateurs", - "userSectionUsage": "utilisent notre Boilerplate" - }, - "howItWorks": { - "howItWorksTitlePrefix": "Comment ça marche :", - "howItWorksTitleHighlight": "Découvrez les avantages de notre produit à chaque étape.", - "howItWorksDescription": "Nous avons conçu notre produit pour simplifier votre vie. Il offre une solution complète. Voici comment il fonctionne et comment il vous profite à chaque étape.", - "prebuiltTitle": "Sections Pré-Construites", - "prebuiltDescription": "Profitez des sections pré-construites comme « Fonctionnalités », « Avantages », « Tarifs » et « Témoignages » pour présenter votre produit efficacement.", - "scalableTitle": "Fondation Évolutive", - "scalableDescription": "Notre modèle est conçu pour évoluer avec votre produit. Ajoutez facilement de nouvelles fonctionnalités selon vos besoins.", - "easyTitle": "Personnalisation Facile", - "easyDescription": "Adaptez l'expérience à vos besoins et préférences spécifiques pour des résultats maximaux." - }, - "testimonials": { - "title": "Témoignages de Clients", - "description": "Ne vous fiez pas seulement à notre parole : découvrez ce que les utilisateurs réels de notre produit ont à dire sur leur expérience.", - "content": "J'utilise ce service d'hébergement web depuis plus d'un an et je suis vraiment impressionné par le temps de disponibilité et le support. Le site web n'est jamais tombé et le service client est toujours rapide pour aider avec les problèmes que j'ai. Je recommande vivement !" - }, - "perfectFit": { - "title": "Trouvez la Solution Parfaite", - "description": "Choisissez le plan de modèle qui correspond le mieux aux besoins et au budget de votre projet. Tous les plans incluent l'accès à notre bibliothèque complète de sections pré-construites et à la personnalisation par glisser-déposer.", - "cta": "Voir Notre Plan Tarifaire" - }, - "footer": { - "boilerplate": "Gabarit", - "address": "Détails du logo et adresse", - "newsletterSignUp": "Inscrivez-vous à la Newsletter", - "subscribe": "S'abonner", - "navigation": "Navigation", - "support": "Support", - "legal": "Légal", - "followUs": "Suivez-nous", - "privacyPolicy": "Politique de Confidentialité", - "termsOfUse": "Conditions d'Utilisation", - "enterYourEmail": "Entrez votre e-mail", - "links": { - "navigation": "Navigation", - "home": "Accueil", - "aboutUs": "À Propos de Nous", - "career": "Carrière", - "features": "Fonctionnalités", - "blog": "Blog", - "status": "Statut", - "support": "Support", - "helpCenter": "Centre d'Aide", - "faq": "FAQ", - "waitingList": "Liste d'Attente", - "pricingExperience": "Expérience Tarifaire", - "contactUs": "Contactez-nous", - "legal": "Légal", - "privacyPolicy": "Politique de Confidentialité", - "termsAndConditions": "Conditions Générales" - }, - "social": { - "facebook": "Facebook", - "instagram": "Instagram", - "linkedin": "LinkedIn", - "youtube": "YouTube" - }, - "footerBottom": { - "privacyPolicy": "Politique de Confidentialité", - "termsOfUse": "Conditions d'Utilisation", - "copyright": "2024 Tous Droits Réservés" - } - }, - "pricing": { - "pricingTitle": "Plan de Tarification Simple et {{Abordable}}", - "pricingContent": "Nos plans flexibles sont conçus pour évoluer avec votre entreprise. Nous avons un plan pour vous.", - "monthly": "Mensuel", - "annual": "Annuel (économisez 20%)", - "billingPlansNotAvailable": "Plans de facturation non disponibles", - "features": { - "feature1": "2 Projets", - "feature2": "Jusqu'à 100 abonnés", - "feature3": "Analyse de base", - "feature4": "Délai de réponse du support de 24 heures", - "feature5": "Conseiller marketing", - "feature6": "Intégration personnalisée", - "continue": "Continuer" - }, - "essentials": "Les éléments essentiels pour fournir votre meilleur travail aux clients.", - "faqHeader": "Questions Fréquemment Posées", - "faqSubHeader": "Nous n'avons pas pu répondre à votre question ?", - "contactUs": "Contactez-nous", - "continue": "Continuer" - }, - "faq": { - "question1": "Quel est le but de cette application ?", - "answer1": "Cette application est conçue pour aider les utilisateurs à gérer leurs tâches efficacement en fournissant des outils pour la planification, le suivi des progrès et la définition de rappels.", - "question2": "Comment réinitialiser mon mot de passe ?", - "answer2": "Pour réinitialiser votre mot de passe, allez sur la page de connexion et cliquez sur le lien 'Mot de passe oublié'. Suivez les instructions pour recevoir un e-mail de réinitialisation de mot de passe et créer un nouveau mot de passe.", - "question3": "Puis-je utiliser cette application sur plusieurs appareils ?", - "answer3": "Oui, l'application est accessible depuis plusieurs appareils, y compris les ordinateurs de bureau, les tablettes et les smartphones. Vos données seront synchronisées sur tous les appareils, garantissant une expérience fluide." - }, - "noJobs": { - "noJobsTitle": "Aucun emploi disponible pour le moment", - "noJobsContent": "Revenez plus tard !" - }, - "ourServices": { - "title": "Nos Services", - "description": "Formés pour Vous Offrir le Meilleur", - "details": "Depuis notre création, Hng Boilerplate est dédié à évoluer constamment pour rester en avance. Notre état d’esprit agile et notre quête incessante d'innovation garantissent que vous disposez toujours des outils et des stratégies les plus efficaces." - }, - "mission": { - "title": "Notre Mission & Vision", - "subtitle": "Ouvrir la Voie, Redéfinir les Industries", - "description": "Chez Hng Boilerplate, nous sommes dédiés à dépasser vos attentes. Nous nous efforçons de comprendre vos besoins et défis uniques, en fournissant des solutions sur mesure qui génèrent des résultats réels et favorisent votre succès." - }, - "coreValues": { - "title": "Nos Valeurs Fondamentales", - "description": "Nos Valeurs forment le cœur de notre organisation et définissent le caractère de notre secteur.", - "values": { - "integrity": { - "title": "Intégrité", - "description": "Nous maintenons les plus hauts standards éthiques dans tout ce que nous faisons, favorisant la confiance et la transparence avec nos clients, partenaires et employés. Nous croyons que l'honnêteté et l'intégrité sont les fondements d'un succès durable." - }, - "customerCentricity": { - "title": "Centricité Client", - "description": "Nos clients sont au cœur de notre activité. Nous nous efforçons de comprendre leurs besoins, de dépasser leurs attentes et de construire des relations durables basées sur la confiance et le respect mutuel. Nous croyons que placer nos clients en premier est la clé du succès à long terme." - }, - "innovation": { - "title": "Innovation", - "description": "Nous adoptons une culture d'amélioration continue et de créativité, cherchant constamment de nouvelles façons d'évoluer et d'améliorer nos produits, services et processus. Nous encourageons l'expérimentation et la prise de risques, reconnaissant que l'innovation est essentielle pour la croissance." - }, - "excellence": { - "title": "Excellence", - "description": "Nous nous engageons à offrir une qualité exceptionnelle dans tout ce que nous faisons, de nos produits et services à nos interactions avec les clients et nos processus internes. Nous visons l'amélioration continue et nous nous tenons aux plus hauts standards de performance." - } - } + "navbar": { + "login": "Se connecter", + "register": "Commencer" + }, + "navLinks": { + "home": "Accueil", + "pricing": "Tarification", + "careers": "Carrières" + }, + "login": { + "title": "Connexion", + "welcomeBack": "Bon retour, tu nous as manqué !", + "continueWithGoogle": "Continuer avec Google", + "emailPlaceholder": "Entrez l'adresse e-mail", + "passwordPlaceholder": "Entrez le mot de passe", + "rememberMe": "Se souvenir de moi", + "forgotPassword": "Mot de passe oublié ?", + "loginButton": "Connexion", + "signInWithMagicLink": "Se connecter avec un lien magique", + "noAccount": "Vous n'avez pas de compte ?", + "agree": "En vous connectant, vous acceptez les", + "and": "et", + "signUp": "S'inscrire", + "termsOfService": "Conditions d'utilisation", + "privacyPolicy": "Politique de confidentialité", + "loggingIn": "Connexion en cours..." + }, + "register": { + "signUp": "S'inscrire", + "createAccountDesc": "Créez un compte pour commencer avec nous.", + "continueWithGoogle": "Continuer avec Google", + "firstName": "Prénom", + "firstNamePlaceholder": "Entrez votre prénom", + "lastName": "Nom", + "lastNamePlaceholder": "Entrez votre nom", + "email": "Email", + "emailPlaceholder": "Entrez l'adresse email", + "password": "Mot de passe", + "passwordPlaceholder": "Entrez le mot de passe", + "createAccount": "Créer un compte", + "loggingIn": "Connexion en cours...", + "emailVerification": "Vérification de l'email", + "emailVerificationDesc": "Nous avons envoyé un code à votre email {email}", + "checkSpam": "vérifiez votre spam si vous ne recevez pas l'email", + "otpExpiresIn": "OTP expire dans : {timeLeft}", + "resendCode": "Vous n'avez pas reçu le code ? renvoyez", + "dataProcessing": "Nous traiterons vos données comme indiqué dans nos Conditions d'utilisation, Politique de confidentialité et Accord de traitement des données", + "alreadyHaveAccount": "Vous avez déjà un compte ? Connexion" + }, + "HomePage": { + "title": "Bonjour le monde !" + }, + "hero": { + "headline": "Concentrez-vous sur l'essentiel. Nous avons la base.", + "description": "Rationalisez vos processus avec une base de code conçue pour l'efficacité et une productivité optimale.", + "cta": "Commencer" + }, + "userSection": { + "userSectionMoreThan": "Plus de 200", + "userSectionUsers": "Utilisateurs", + "userSectionUsage": "utilisent notre Boilerplate" + }, + "howItWorks": { + "howItWorksTitlePrefix": "Comment ça marche :", + "howItWorksTitleHighlight": "Découvrez les avantages de notre produit à chaque étape.", + "howItWorksDescription": "Nous avons conçu notre produit pour simplifier votre vie. Il offre une solution complète. Voici comment il fonctionne et comment il vous profite à chaque étape.", + "prebuiltTitle": "Sections Pré-Construites", + "prebuiltDescription": "Profitez des sections pré-construites comme « Fonctionnalités », « Avantages », « Tarifs » et « Témoignages » pour présenter votre produit efficacement.", + "scalableTitle": "Fondation Évolutive", + "scalableDescription": "Notre modèle est conçu pour évoluer avec votre produit. Ajoutez facilement de nouvelles fonctionnalités selon vos besoins.", + "easyTitle": "Personnalisation Facile", + "easyDescription": "Adaptez l'expérience à vos besoins et préférences spécifiques pour des résultats maximaux." + }, + "testimonials": { + "title": "Témoignages de Clients", + "description": "Ne vous fiez pas seulement à notre parole : découvrez ce que les utilisateurs réels de notre produit ont à dire sur leur expérience.", + "content": "J'utilise ce service d'hébergement web depuis plus d'un an et je suis vraiment impressionné par le temps de disponibilité et le support. Le site web n'est jamais tombé et le service client est toujours rapide pour aider avec les problèmes que j'ai. Je recommande vivement !" + }, + "perfectFit": { + "title": "Trouvez la Solution Parfaite", + "description": "Choisissez le plan de modèle qui correspond le mieux aux besoins et au budget de votre projet. Tous les plans incluent l'accès à notre bibliothèque complète de sections pré-construites et à la personnalisation par glisser-déposer.", + "cta": "Voir Notre Plan Tarifaire" + }, + "footer": { + "boilerplate": "Gabarit", + "address": "Détails du logo et adresse", + "newsletterSignUp": "Inscrivez-vous à la Newsletter", + "subscribe": "S'abonner", + "navigation": "Navigation", + "support": "Support", + "legal": "Légal", + "followUs": "Suivez-nous", + "privacyPolicy": "Politique de Confidentialité", + "termsOfUse": "Conditions d'Utilisation", + "enterYourEmail": "Entrez votre e-mail", + "links": { + "navigation": "Navigation", + "home": "Accueil", + "aboutUs": "À Propos de Nous", + "career": "Carrière", + "features": "Fonctionnalités", + "blog": "Blog", + "status": "Statut", + "support": "Support", + "helpCenter": "Centre d'Aide", + "faq": "FAQ", + "waitingList": "Liste d'Attente", + "pricingExperience": "Expérience Tarifaire", + "contactUs": "Contactez-nous", + "legal": "Légal", + "privacyPolicy": "Politique de Confidentialité", + "termsAndConditions": "Conditions Générales" + }, + "social": { + "facebook": "Facebook", + "instagram": "Instagram", + "linkedin": "LinkedIn", + "youtube": "YouTube" + }, + "footerBottom": { + "privacyPolicy": "Politique de Confidentialité", + "termsOfUse": "Conditions d'Utilisation", + "copyright": "2024 Tous Droits Réservés" + } + }, + "pricing": { + "pricingTitle": "Plan de Tarification Simple et {{Abordable}}", + "pricingContent": "Nos plans flexibles sont conçus pour évoluer avec votre entreprise. Nous avons un plan pour vous.", + "monthly": "Mensuel", + "annual": "Annuel (économisez 20%)", + "billingPlansNotAvailable": "Plans de facturation non disponibles", + "features": { + "feature1": "2 Projets", + "feature2": "Jusqu'à 100 abonnés", + "feature3": "Analyse de base", + "feature4": "Délai de réponse du support de 24 heures", + "feature5": "Conseiller marketing", + "feature6": "Intégration personnalisée", + "continue": "Continuer" + }, + "essentials": "Les éléments essentiels pour fournir votre meilleur travail aux clients.", + "faqHeader": "Questions Fréquemment Posées", + "faqSubHeader": "Nous n'avons pas pu répondre à votre question ?", + "contactUs": "Contactez-nous", + "continue": "Continuer" + }, + "faq": { + "question1": "Quel est le but de cette application ?", + "answer1": "Cette application est conçue pour aider les utilisateurs à gérer leurs tâches efficacement en fournissant des outils pour la planification, le suivi des progrès et la définition de rappels.", + "question2": "Comment réinitialiser mon mot de passe ?", + "answer2": "Pour réinitialiser votre mot de passe, allez sur la page de connexion et cliquez sur le lien 'Mot de passe oublié'. Suivez les instructions pour recevoir un e-mail de réinitialisation de mot de passe et créer un nouveau mot de passe.", + "question3": "Puis-je utiliser cette application sur plusieurs appareils ?", + "answer3": "Oui, l'application est accessible depuis plusieurs appareils, y compris les ordinateurs de bureau, les tablettes et les smartphones. Vos données seront synchronisées sur tous les appareils, garantissant une expérience fluide." + }, + "noJobs": { + "noJobsTitle": "Aucun emploi disponible pour le moment", + "noJobsContent": "Inscrivez-vous à notre newsletter pour recevoir des mises à jour sur les offres d'emploi.", + "modalTitle": "Newsletter", + "button": "Regístrate en el boletín", + "placeholder": "Veuillez fournir votre adresse e-mail", + "modalButton": "S'abonner", + "error": "Veuillez fournir votre adresse e-mail", + "subscribed": "Merci pour votre abonnement" + }, + "ourServices": { + "title": "Nos Services", + "description": "Formés pour Vous Offrir le Meilleur", + "details": "Depuis notre création, Hng Boilerplate est dédié à évoluer constamment pour rester en avance. Notre état d’esprit agile et notre quête incessante d'innovation garantissent que vous disposez toujours des outils et des stratégies les plus efficaces." + }, + "mission": { + "title": "Notre Mission & Vision", + "subtitle": "Ouvrir la Voie, Redéfinir les Industries", + "description": "Chez Hng Boilerplate, nous sommes dédiés à dépasser vos attentes. Nous nous efforçons de comprendre vos besoins et défis uniques, en fournissant des solutions sur mesure qui génèrent des résultats réels et favorisent votre succès." + }, + "coreValues": { + "title": "Nos Valeurs Fondamentales", + "description": "Nos Valeurs forment le cœur de notre organisation et définissent le caractère de notre secteur.", + "values": { + "integrity": { + "title": "Intégrité", + "description": "Nous maintenons les plus hauts standards éthiques dans tout ce que nous faisons, favorisant la confiance et la transparence avec nos clients, partenaires et employés. Nous croyons que l'honnêteté et l'intégrité sont les fondements d'un succès durable." + }, + "customerCentricity": { + "title": "Centricité Client", + "description": "Nos clients sont au cœur de notre activité. Nous nous efforçons de comprendre leurs besoins, de dépasser leurs attentes et de construire des relations durables basées sur la confiance et le respect mutuel. Nous croyons que placer nos clients en premier est la clé du succès à long terme." + }, + "innovation": { + "title": "Innovation", + "description": "Nous adoptons une culture d'amélioration continue et de créativité, cherchant constamment de nouvelles façons d'évoluer et d'améliorer nos produits, services et processus. Nous encourageons l'expérimentation et la prise de risques, reconnaissant que l'innovation est essentielle pour la croissance." + }, + "excellence": { + "title": "Excellence", + "description": "Nous nous engageons à offrir une qualité exceptionnelle dans tout ce que nous faisons, de nos produits et services à nos interactions avec les clients et nos processus internes. Nous visons l'amélioration continue et nous nous tenons aux plus hauts standards de performance." + } } -} \ No newline at end of file + } +} diff --git a/src/app/(landing-routes)/career/Nojobs.tsx b/src/app/(landing-routes)/career/Nojobs.tsx index 7408b1afc..942607a93 100644 --- a/src/app/(landing-routes)/career/Nojobs.tsx +++ b/src/app/(landing-routes)/career/Nojobs.tsx @@ -1,61 +1,174 @@ +"use client"; + +import axios from "axios"; import { useTranslations } from "next-intl"; +import Image from "next/image"; +import { useState } from "react"; + +import { getApiUrl } from "~/actions/getApiUrl"; +import CustomButton from "~/components/common/common-button/common-button"; +import { Input } from "~/components/common/input"; +import LoadingSpinner from "~/components/miscellaneous/loading-spinner"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "~/components/ui/dialog"; +import { useToast } from "~/components/ui/use-toast"; +import noJob from "../../../../public/images/career/noJob.svg"; function Nojobs() { + const [loading, setLoading] = useState(false); + const [email, setEmail] = useState(""); + const [error, setError] = useState(false); + const [isSubscribed, setIsSubscribed] = useState(false); + const { toast } = useToast(); + const t = useTranslations("noJobs"); + + const locale = localStorage.getItem("preferredLanguage"); + const toastDesc = + locale === "fr" + ? "Veuillez fournir votre e-mail" + : locale === "es" + ? "Por favor, proporcione su correo electrónico" + : "Please provide a valid email"; + + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + const isValidEmail = (email: string): boolean => emailRegex.test(email); + const [isOpen, setIsOpen] = useState(false); + + const handleSubmit = async () => { + if (!isValidEmail(email)) { + setError(true); + + toast({ + title: "Error", + description: toastDesc, + variant: "destructive", + }); + return; + } + setLoading(true); + + const apiUrl = await getApiUrl(); + await axios + .post( + `${apiUrl}/api/v1/newsletter-subscription`, + { email }, + { + headers: { + "Content-Type": "application/json", + }, + }, + ) + .then(() => { + toast({ + title: "Thank you for subscribing!", + description: + "You've successfully joined our newsletter. We're excited to keep you updated with our latest news and offers!", + variant: "default", + }); + setIsOpen(false); + setLoading(false); + setEmail(""); + setIsSubscribed(true); + }) + .catch((error) => { + if (error?.response) { + const errorData = error.response.data; + if (errorData.status_code === 400) { + toast({ + title: "You're already subscribed!", + description: + "It looks like you're already on our list. Thank you for being part of our community!", + variant: "default", + }); + } else { + toast({ + title: "Oops! Something went wrong.", + description: + "We encountered an issue while trying to subscribe you to our newsletter. Check your internet connection or contact support if the problem persists.", + variant: "destructive", + }); + setLoading(false); + } + setLoading(false); + return; + } + }) + .finally(() => { + setLoading(false); + }); + }; + return (
- - - - - - - - - - - + No Job

{t("noJobsTitle")}

- {t("noJobsContent")} + {isSubscribed ? t("subscribed") : t("noJobsContent")}

+ + {!isSubscribed && ( + + +
+ +
+
+ + + + {t("modalTitle")} + {t("noJobsContent")} + + +
+
+
+ setEmail(event.target.value)} + value={email} + onBlur={() => + email.length === 0 ? setError(true) : setError(false) + } + /> +
+ + {loading ? ( + + ) : ( + t("modalButton") + )} + +
+ {error && ( + + {t("error")} + + )} +
+
+
+ )}
); } From a9356624b44ed1c4b6ba79235766cd2a00007abc Mon Sep 17 00:00:00 2001 From: Peter Abah Date: Fri, 23 Aug 2024 15:30:25 +0100 Subject: [PATCH 06/22] fix: fix multiple timezones selected simultaenously --- .../admin/(settings)/settings/language-and-region/page.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/language-and-region/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/language-and-region/page.tsx index 7c23e7cf6..40383c85b 100644 --- a/src/app/dashboard/(admin)/admin/(settings)/settings/language-and-region/page.tsx +++ b/src/app/dashboard/(admin)/admin/(settings)/settings/language-and-region/page.tsx @@ -34,11 +34,8 @@ const formatTimeZone = () => { const sign = offset >= 0 ? "+" : "-"; const formattedOffset = `UTC${sign}${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`; - // Create a simplified value for the timezone (e.g., "utc+0" or "utc-8") - const value = `utc${sign}${hours}`; - return { - value: value, + value: `(${formattedOffset}) ${tz.replace("_", " ")}`, label: `(${formattedOffset}) ${tz.replace("_", " ")}`, }; }); From a9dc76456c05cf5bf7cedb664e740b8a7ae1b4a8 Mon Sep 17 00:00:00 2001 From: Mary <101870828+Chioma227@users.noreply.github.com> Date: Fri, 23 Aug 2024 18:52:25 +0100 Subject: [PATCH 07/22] chore: fix Non-Functional-Terms-of-Service-and-Privacy-Policy-Links --- src/app/(auth-routes)/login/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/(auth-routes)/login/page.tsx b/src/app/(auth-routes)/login/page.tsx index 553cfd797..269782fdb 100644 --- a/src/app/(auth-routes)/login/page.tsx +++ b/src/app/(auth-routes)/login/page.tsx @@ -283,14 +283,14 @@ const Login = () => { {t("agree")}{" "} {t("termsOfService")} {" "} {t("and")}{" "} {t("privacyPolicy")} From 91bfb32cae8683dcd4009560099f2a876c965a59 Mon Sep 17 00:00:00 2001 From: Mary <101870828+Chioma227@users.noreply.github.com> Date: Fri, 23 Aug 2024 19:03:15 +0100 Subject: [PATCH 08/22] chore: remove duplicate contactUs from help-center --- src/app/(landing-routes)/help-center/page.tsx | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/app/(landing-routes)/help-center/page.tsx b/src/app/(landing-routes)/help-center/page.tsx index 26ff2313b..768041179 100644 --- a/src/app/(landing-routes)/help-center/page.tsx +++ b/src/app/(landing-routes)/help-center/page.tsx @@ -114,17 +114,6 @@ const HelpCenter = () => { > Frequently Asked Questions

- -

- We couldn't answer your question? -

- - - Contact us -
From d7f3b6f5f9068c19782463a6f4eef1abaf18d87c Mon Sep 17 00:00:00 2001 From: Abdulmalik Yusuf <31839174+abdulmalikyusuf@users.noreply.github.com> Date: Fri, 23 Aug 2024 20:23:16 +0100 Subject: [PATCH 09/22] Fix: new password and confirm password mismatch error display. --- .../account/_component.tsx/password.tsx | 169 +++++++++++------- .../settings/account/_component.tsx/schema.ts | 19 ++ 2 files changed, 119 insertions(+), 69 deletions(-) create mode 100644 src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/schema.ts diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/password.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/password.tsx index c818f5fa5..4b5a99a26 100644 --- a/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/password.tsx +++ b/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/password.tsx @@ -1,64 +1,52 @@ "use client"; +import { zodResolver } from "@hookform/resolvers/zod"; import axios from "axios"; import { useSession } from "next-auth/react"; -import { ChangeEvent, useState } from "react"; +import { useState } from "react"; +import { useForm } from "react-hook-form"; import { getApiUrl } from "~/actions/getApiUrl"; import CustomButton from "~/components/common/common-button/common-button"; -import CustomInput from "~/components/common/input/input"; import PasswordSuccessfulModal from "~/components/common/modals/password-successful"; import { toast } from "~/components/ui/use-toast"; +import { cn } from "~/lib/utils"; +import { passwordSchema, type PasswordFormData } from "./schema"; const Password = () => { const { data } = useSession(); const [open, setOpen] = useState(false); - const [isPending, setIsPending] = useState(false); - const [formData, setFormData] = useState({ - oldPassword: "", - password: "", - confirmPassword: "", + const { + register, + handleSubmit, + reset, + formState: { errors, isValid }, + } = useForm({ + resolver: zodResolver(passwordSchema), + mode: "all", }); - const formDataHandler = ( - event: ChangeEvent, - ) => { - setFormData((previous) => ({ - ...previous, - [event.target.name]: event.target.value, - })); - }; - const submit = async () => { - if (formData.password !== formData.confirmPassword) { - return toast({ - title: "Warning!", - description: "Password does not match", - }); - } + const submitHandler = async (values: PasswordFormData) => { try { setIsPending(true); - const baseUrl = await getApiUrl(); - const API_URL = `${baseUrl}/api/v1/auth/change-password`; - const payload = { - oldPassword: formData.oldPassword, - newPassword: formData.password, + old_password: values.currentPassword, + new_password: values.newPassword, + confirm_new_password: values.confirmPassword, }; + const baseUrl = await getApiUrl(); + const API_URL = `${baseUrl}/api/v1/auth/password`; - await axios.post(API_URL, payload, { + await axios.put(API_URL, payload, { headers: { Authorization: `Bearer ${data?.access_token}`, }, }); setOpen(true); - setFormData({ - oldPassword: "", - password: "", - confirmPassword: "", - }); + reset({ currentPassword: "", newPassword: "", confirmPassword: "" }); } catch (error) { const errorMessage = (error as HttpError)?.response?.data?.message; toast({ @@ -71,9 +59,6 @@ const Password = () => { } }; - const disabled = - !formData.confirmPassword || !formData.oldPassword || !formData.password; - return (
@@ -84,50 +69,96 @@ const Password = () => { Update password for enhanced account security

-
+
- - - +
+
+ +
+ +
+
+ {errors.currentPassword && ( +

+ {errors.currentPassword?.message} +

+ )} +
+
+
+ +
+ +
+
+ {errors.newPassword && ( +

+ {errors.newPassword?.message} +

+ )} +
+
+
+ +
+ +
+
+ {errors.confirmPassword && ( +

+ {errors.confirmPassword?.message} +

+ )} +
- setOpen(false)}> + setOpen(false)} + > Cancel Update Password
-
+ setOpen(!open)} show={open} />
); diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/schema.ts b/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/schema.ts new file mode 100644 index 000000000..96f806966 --- /dev/null +++ b/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/schema.ts @@ -0,0 +1,19 @@ +import * as z from "zod"; + +export const passwordSchema = z + .object({ + currentPassword: z + .string() + .min(8, "Current password must be at least 8 characters long"), + newPassword: z + .string() + .min(8, "New password must be at least 8 characters long"), + confirmPassword: z + .string() + .min(8, "Confirm password must be at least 8 characters long"), + }) + .refine((data) => data.newPassword === data.confirmPassword, { + message: "Passwords do not match", + path: ["confirmPassword"], + }); +export type PasswordFormData = z.infer; From a0e0ca66f5a77ba03d328c1a35ed1c42e5e3cbd0 Mon Sep 17 00:00:00 2001 From: Oluwaseyi Tommy <130176232+seshconcept@users.noreply.github.com> Date: Sat, 24 Aug 2024 00:09:09 +0100 Subject: [PATCH 10/22] Fix: responsiveness and uniform alignment of waitlist page. --- src/components/waitList/WaitListForm.tsx | 12 +++++------ src/components/waitList/WaitlistDialog.tsx | 22 ++++++++++++--------- src/components/waitList/WaitlistJoin.tsx | 10 +++++----- src/components/waitList/WaitlistPayment.tsx | 6 ++++-- 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/components/waitList/WaitListForm.tsx b/src/components/waitList/WaitListForm.tsx index 549d53c73..f997e6591 100644 --- a/src/components/waitList/WaitListForm.tsx +++ b/src/components/waitList/WaitListForm.tsx @@ -122,7 +122,7 @@ const WaitlistForm: React.FC = () => { }; return ( -
+
{ src="/images/WaitList/circle 1.svg" alt="Circle with Tick" /> -

+

Deployment made easy

-

+

You can level up your SaaS production today

-

+

Join our waitlist and get early access to our boilerplates

-
+
{isSubmitted ? (
{
diff --git a/src/components/waitList/WaitlistDialog.tsx b/src/components/waitList/WaitlistDialog.tsx index 39dd00a89..ce4c98955 100644 --- a/src/components/waitList/WaitlistDialog.tsx +++ b/src/components/waitList/WaitlistDialog.tsx @@ -4,8 +4,8 @@ import React from "react"; const WaitlistDialog: React.FC = () => { return (
-
-
+
+
{ height="25" />
-

+

Easy Customization

@@ -22,7 +22,7 @@ const WaitlistDialog: React.FC = () => { maximum results

-
+
{ height="30" />
-

+

Scalable Foundation

@@ -39,7 +39,7 @@ const WaitlistDialog: React.FC = () => { product

-
+
{ height="36" />
-

+

Pre-built Sections

@@ -65,8 +65,12 @@ const WaitlistDialog: React.FC = () => {

-

Resource variety

-

150+ Team support

+

+ Resource variety +

+

+ 150+ Team support +

diff --git a/src/components/waitList/WaitlistJoin.tsx b/src/components/waitList/WaitlistJoin.tsx index bbcdc9239..c2a7f1c06 100644 --- a/src/components/waitList/WaitlistJoin.tsx +++ b/src/components/waitList/WaitlistJoin.tsx @@ -14,21 +14,21 @@ const scrollToForm = () => { const WaitlistJoin: React.FC = () => { return (
-
+
waitlist
-
-

+
+

Join the waitlist and get early{" "} access!

-

+

Transform your remote work meetings into fun and engaging sessions with our innovative game-based platform.

-

+

Be a part of the first 2300 users for a{" "} 10% discount{" "}

diff --git a/src/components/waitList/WaitlistPayment.tsx b/src/components/waitList/WaitlistPayment.tsx index 9fa2a9991..947bf9096 100644 --- a/src/components/waitList/WaitlistPayment.tsx +++ b/src/components/waitList/WaitlistPayment.tsx @@ -95,8 +95,10 @@ const WaitlistPayment: React.FC = () => { return (
-

We have got you covered

-

+

+ We have got you covered +

+

Transform your Deployment the easy and seamless way with our boilerplates.

From 1a374ef9d80995a9b590439fd663ef2cb1734c7c Mon Sep 17 00:00:00 2001 From: Abdulmalik Yusuf <31839174+abdulmalikyusuf@users.noreply.github.com> Date: Sat, 24 Aug 2024 00:11:07 +0100 Subject: [PATCH 11/22] Fix: dashboard homepage moble layout responsiveness. --- .../dashboard/(user-dashboard)/(user-metrics)/layout.tsx | 2 +- src/app/dashboard/(user-dashboard)/(user-metrics)/page.tsx | 2 +- src/app/dashboard/(user-dashboard)/layout.tsx | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/app/dashboard/(user-dashboard)/(user-metrics)/layout.tsx b/src/app/dashboard/(user-dashboard)/(user-metrics)/layout.tsx index 015021e12..dbe5f72ec 100644 --- a/src/app/dashboard/(user-dashboard)/(user-metrics)/layout.tsx +++ b/src/app/dashboard/(user-dashboard)/(user-metrics)/layout.tsx @@ -21,7 +21,7 @@ const links = [ export default function UserMetricsLayout({ children }: PropsWithChildren) { return ( -
+

Dashboard

diff --git a/src/app/dashboard/(user-dashboard)/(user-metrics)/page.tsx b/src/app/dashboard/(user-dashboard)/(user-metrics)/page.tsx index 6df461c23..7cf891d1f 100644 --- a/src/app/dashboard/(user-dashboard)/(user-metrics)/page.tsx +++ b/src/app/dashboard/(user-dashboard)/(user-metrics)/page.tsx @@ -9,7 +9,7 @@ export default function DashboardOverview() {
- +
diff --git a/src/app/dashboard/(user-dashboard)/layout.tsx b/src/app/dashboard/(user-dashboard)/layout.tsx index 54b35b55a..9448e15dc 100644 --- a/src/app/dashboard/(user-dashboard)/layout.tsx +++ b/src/app/dashboard/(user-dashboard)/layout.tsx @@ -15,8 +15,10 @@ export default function AdminLayout({
- -
+
+ +
+
{children}
{" "} From 9e6e85ac371e8bfe75498780d9a94e77e322069a Mon Sep 17 00:00:00 2001 From: maetheartist Date: Sat, 24 Aug 2024 00:14:07 +0100 Subject: [PATCH 12/22] fixed the social links to route to the sites. --- src/components/layouts/footer/index.tsx | 60 +++++++++++++------------ 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/src/components/layouts/footer/index.tsx b/src/components/layouts/footer/index.tsx index 0e4eadca9..8e7b94cec 100644 --- a/src/components/layouts/footer/index.tsx +++ b/src/components/layouts/footer/index.tsx @@ -127,28 +127,29 @@ const Footer = () => { }, ]; - const socialLinks = [ - { - icon: XIcon, - link: "/", - }, - { - icon: Youtube, - link: "/", - }, - { - icon: Instagram, - link: "/", - }, - { - icon: Linkedin, - link: "/", - }, - { - icon: Facebook, - link: "/", - }, - ]; + +const socialLinks = [ + { + icon: XIcon, + link: "https://twitter.com", + }, + { + icon: Youtube, + link: "https://youtube.com", + }, + { + icon: Instagram, + link: "https://instagram.com", + }, + { + icon: Linkedin, + link: "https://linkedin.com", + }, + { + icon: Facebook, + link: "https://facebook.com", + }, +]; const footerBottom = [ { route: "privacyPolicy", link: "/" }, @@ -295,12 +296,15 @@ const Footer = () => {
{socialLinks.map((item, index) => { return ( -
- -
+ + + ); })}
From 6710bbd4b4ff4f5e0ff561bf79aa4b9cce51889b Mon Sep 17 00:00:00 2001 From: JoshuaAkpan Date: Sat, 24 Aug 2024 01:02:54 +0100 Subject: [PATCH 13/22] feat: enhance create role form with validation and error handling --- .../create-role/page.tsx | 41 +++++++++++++++---- src/schemas/index.ts | 23 ++++++++--- 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx index b52da934e..a9644b8ae 100644 --- a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx +++ b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx @@ -136,8 +136,9 @@ function CreateNewRolePage() { handleSubmit, formState: { errors }, setValue, + trigger, } = useForm({ - mode: "onBlur", + mode: "onChange", resolver: zodResolver(roleSchema), }); @@ -199,6 +200,10 @@ function CreateNewRolePage() { } }; + const handleInputChange = (field: keyof UseFormInputs) => { + trigger(field); + }; + return (
@@ -229,17 +234,28 @@ function CreateNewRolePage() { handleInputChange("name"), + })} + className={`!w-full rounded-md border ${ + errors.name ? "border-red-500" : "border-border" + } bg-transparent px-3 py-2 shadow-sm outline-none focus:border-primary focus:ring-ring md:w-56`} /> + {errors.name && ( +

{errors.name.message}

+ )}
+
{errors.permissions && ( -

Please select valid permissions.

+

+ {errors.permissions.message} +

)}
@@ -271,9 +289,18 @@ function CreateNewRolePage() {