+
@@ -14,7 +14,7 @@ export function Footer() {
-
© 2024 Lectify. Todos os direitos reservados.
+
© 2025 Lectify. Todos os direitos reservados.
);
diff --git a/src/components/Input/InputCode/index.tsx b/src/components/Input/InputCode/index.tsx
index 09c8f03..19a8618 100644
--- a/src/components/Input/InputCode/index.tsx
+++ b/src/components/Input/InputCode/index.tsx
@@ -1,8 +1,8 @@
-import { errorColor, normalColor } from '@/constants/form/form-colors';
+import { Error } from '@/components/Error';
+import { ERROR_COLOR, NORMAL_COLOR } from '@/constants/form/form-colors';
import { cn } from '@/utils/cn';
-import { InputCodeProps } from './InputCodeProps';
import { CheckCodeFormInputs } from 'schemas/code-schema';
-import { Error } from '@/components/Error';
+import { InputCodeProps } from './InputCodeProps';
export function InputCode({
label,
@@ -35,7 +35,7 @@ export function InputCode({
autoComplete="one-time-code"
className={cn(
'block size-12 text-center rounded-md sm:text-sm [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none disabled:opacity-50 disabled:pointer-events-none',
- errors ? errorColor : normalColor,
+ errors ? ERROR_COLOR : NORMAL_COLOR,
className
)}
placeholder="⚬"
diff --git a/src/components/Input/InputRoot/index.tsx b/src/components/Input/InputRoot/index.tsx
index b5823c8..0b5c960 100644
--- a/src/components/Input/InputRoot/index.tsx
+++ b/src/components/Input/InputRoot/index.tsx
@@ -1,4 +1,4 @@
-import { errorColor, normalColor } from '@/constants/form/form-colors';
+import { ERROR_COLOR, NORMAL_COLOR } from '@/constants/form/form-colors';
import { cn } from '@/utils/cn';
import { MdErrorOutline } from 'react-icons/md';
import { InputProps } from './InputProps';
@@ -23,7 +23,7 @@ export function InputRoot({
{...props}
className={cn(
'py-2.5 sm:py-3 px-4 pr-8 block w-full rounded-lg sm:text-sm disabled:opacity-50 disabled:pointer-events-none',
- errors ? errorColor : normalColor,
+ errors ? ERROR_COLOR : NORMAL_COLOR,
className
)}
/>
diff --git a/src/components/MyAccount/AccountInfos/index.tsx b/src/components/MyAccount/AccountInfos/index.tsx
index 808a549..c4d5fbf 100644
--- a/src/components/MyAccount/AccountInfos/index.tsx
+++ b/src/components/MyAccount/AccountInfos/index.tsx
@@ -1,6 +1,6 @@
'use client';
import { Loading } from '@/components/Loading';
-import { fieldsAccount } from '@/constants/form/fields-account';
+import { FIELDS_ACCOUNT } from '@/constants/form/fields-account';
import { InformationsAccountType } from '@/types/InformationsAccountType';
import { getInformationItem } from '@/utils/informations/get-informations';
import { useEffect, useState } from 'react';
@@ -20,7 +20,7 @@ export function AccountInfos() {
return (
- {fieldsAccount(info).map((field) => (
+ {FIELDS_ACCOUNT(info).map((field) => (
{field.label}:
{field.value}
diff --git a/src/components/PdfViewer/index.tsx b/src/components/PdfViewer/index.tsx
new file mode 100644
index 0000000..21994ac
--- /dev/null
+++ b/src/components/PdfViewer/index.tsx
@@ -0,0 +1,15 @@
+export function PdfViewer() {
+ return (
+
+ );
+}
diff --git a/src/components/Radio/RadioProps.ts b/src/components/Radio/RadioProps.ts
new file mode 100644
index 0000000..3690a65
--- /dev/null
+++ b/src/components/Radio/RadioProps.ts
@@ -0,0 +1,6 @@
+export interface RadioProps {
+ text: string;
+ value: string;
+ checked: boolean;
+ onChange: (e: React.ChangeEvent
) => void;
+}
diff --git a/src/components/Radio/index.tsx b/src/components/Radio/index.tsx
new file mode 100644
index 0000000..779e11b
--- /dev/null
+++ b/src/components/Radio/index.tsx
@@ -0,0 +1,20 @@
+import { RadioProps } from './RadioProps';
+
+export function Radio({ value, text, checked, onChange }: RadioProps) {
+ return (
+
+
+
+
+ );
+}
diff --git a/src/components/Sidebar/index.tsx b/src/components/Sidebar/index.tsx
index 5afda8c..0a5fabf 100644
--- a/src/components/Sidebar/index.tsx
+++ b/src/components/Sidebar/index.tsx
@@ -1,6 +1,6 @@
'use client';
-import { sidebarItemsBody } from '@/constants/sidebar/sidebar-items-body';
-import { sidebarItemsFooter } from '@/constants/sidebar/sidebar-items-footer';
+import { SIDEBAR_ITEMS_BODY } from '@/constants/sidebar/sidebar-items-body';
+import { SIDEBAR_ITEMS_FOOTER } from '@/constants/sidebar/sidebar-items-footer';
import { usePathname } from 'next/navigation';
import { SidebarBody } from './SidebarBody';
import { SidebarContainer } from './SidebarContainer';
@@ -16,13 +16,13 @@ export function Sidebar() {
- {sidebarItemsBody.map((item) => (
+ {SIDEBAR_ITEMS_BODY.map((item) => (
))}
- {sidebarItemsFooter.map((item) => (
+ {SIDEBAR_ITEMS_FOOTER.map((item) => (
- {passwordStrongRules.map((password) => (
+ {PASSWORD_STRONG_RULES.map((password) => (
;
diff --git a/src/components/SummaryGenerated/FileView/index.tsx b/src/components/SummaryGenerated/FileView/index.tsx
new file mode 100644
index 0000000..4bfb40f
--- /dev/null
+++ b/src/components/SummaryGenerated/FileView/index.tsx
@@ -0,0 +1,10 @@
+import { PdfViewer } from '@/components/PdfViewer';
+import { FileViewProps } from './FileViewProps';
+
+export function FileView({ url, format }: FileViewProps) {
+ return (
+
+ );
+}
diff --git a/src/components/SummaryGenerated/SummaryGeneratedProps.ts b/src/components/SummaryGenerated/SummaryGeneratedProps.ts
new file mode 100644
index 0000000..71aefcd
--- /dev/null
+++ b/src/components/SummaryGenerated/SummaryGeneratedProps.ts
@@ -0,0 +1,5 @@
+export interface SummaryGeneratedProps {
+ hasSummary?: boolean;
+ url?: string;
+ format?: string;
+}
diff --git a/src/components/SummaryGenerated/index.tsx b/src/components/SummaryGenerated/index.tsx
new file mode 100644
index 0000000..fa8f599
--- /dev/null
+++ b/src/components/SummaryGenerated/index.tsx
@@ -0,0 +1,18 @@
+import { FaFileAlt } from 'react-icons/fa';
+import { FileView } from './FileView';
+import { SummaryGeneratedProps } from './SummaryGeneratedProps';
+
+export function SummaryGenerated({ hasSummary = false, url, format }: SummaryGeneratedProps) {
+ return (
+ <>
+ {hasSummary ? (
+
+ ) : (
+
+
+ Nenhum resumo foi gerado ainda. Assim que você criar um, ele aparecerá aqui.
+
+ )}
+ >
+ );
+}
diff --git a/src/constants/footer/contacts.ts b/src/constants/footer/contacts.ts
index d35f653..1ff52f4 100644
--- a/src/constants/footer/contacts.ts
+++ b/src/constants/footer/contacts.ts
@@ -1,7 +1,6 @@
-import { IoLogoGithub } from 'react-icons/io5';
-import { IoLogoLinkedin } from 'react-icons/io5';
+import { IoLogoGithub, IoLogoLinkedin } from 'react-icons/io5';
-export const contacts = [
+export const CONTACTS = [
{ link: 'https://github.com/Francine02', name: 'Francine', icon: IoLogoGithub },
{ link: 'https://www.linkedin.com/in/francine-ccruz/', name: 'Francine', icon: IoLogoLinkedin },
{ link: 'https://github.com/id0ubl3g', name: 'George', icon: IoLogoGithub },
diff --git a/src/constants/form/delete-account.ts b/src/constants/form/delete-account.ts
index 68a8aba..0321c98 100644
--- a/src/constants/form/delete-account.ts
+++ b/src/constants/form/delete-account.ts
@@ -1,7 +1,7 @@
import { FaCheck } from 'react-icons/fa';
import { MdError } from 'react-icons/md';
-export const deleteAccount = [
+export const DELETE_ACCOUNT = [
{
key: 'success',
icon: FaCheck,
diff --git a/src/constants/form/fields-account.ts b/src/constants/form/fields-account.ts
index e48ec74..98b4043 100644
--- a/src/constants/form/fields-account.ts
+++ b/src/constants/form/fields-account.ts
@@ -1,7 +1,7 @@
import { InformationsAccountType } from '@/types/InformationsAccountType';
import { formatDatePt } from '@/utils/formatters/formatDatePt';
-export const fieldsAccount = (info: InformationsAccountType) => [
+export const FIELDS_ACCOUNT = (info: InformationsAccountType) => [
{ label: 'Nome de usuário', value: info.username },
{ label: 'Data da conta', value: 'Desde ' + formatDatePt(info.created) },
{ label: 'Email', value: info.email },
diff --git a/src/constants/form/form-colors.ts b/src/constants/form/form-colors.ts
index 8435762..0f4d8a1 100644
--- a/src/constants/form/form-colors.ts
+++ b/src/constants/form/form-colors.ts
@@ -1,4 +1,4 @@
-export const errorColor = 'border-red-500 focus:border-red-500 focus:ring-red-500';
+export const ERROR_COLOR = 'border-red-500 focus:border-red-500 focus:ring-red-500';
-export const normalColor =
+export const NORMAL_COLOR =
'focus:border-purple-600 focus:ring-purple-500 border-gray-200 hover:border-purple-500';
diff --git a/src/constants/form/password-strong-rules.ts b/src/constants/form/password-strong-rules.ts
index b94a385..807109a 100644
--- a/src/constants/form/password-strong-rules.ts
+++ b/src/constants/form/password-strong-rules.ts
@@ -1,4 +1,4 @@
-export const passwordStrongRules = [
+export const PASSWORD_STRONG_RULES = [
{
rules: 'min-length',
message: 'Pelo menos 8 caracteres',
diff --git a/src/constants/form/summary-output-formats.ts b/src/constants/form/summary-output-formats.ts
new file mode 100644
index 0000000..45620d8
--- /dev/null
+++ b/src/constants/form/summary-output-formats.ts
@@ -0,0 +1 @@
+export const SUMMARY_OUTPUT_FORMATS = ['pdf', 'md'] as const;
diff --git a/src/constants/modals/delete-account.ts b/src/constants/modals/delete-account.ts
index cce4b4a..2cbb54b 100644
--- a/src/constants/modals/delete-account.ts
+++ b/src/constants/modals/delete-account.ts
@@ -1,6 +1,6 @@
import { IoWarning } from 'react-icons/io5';
-export const deleteAccount = {
+export const DELETE_ACCOUNT = {
id: 'delete-account-modal',
title: 'Deletar Conta',
icon: IoWarning,
diff --git a/src/constants/sidebar/sidebar-items-body.ts b/src/constants/sidebar/sidebar-items-body.ts
index 806ae70..a113dd9 100644
--- a/src/constants/sidebar/sidebar-items-body.ts
+++ b/src/constants/sidebar/sidebar-items-body.ts
@@ -1,9 +1,14 @@
-import { FaHome } from 'react-icons/fa';
+import { FaFileAlt, FaHome } from 'react-icons/fa';
-export const sidebarItemsBody = [
+export const SIDEBAR_ITEMS_BODY = [
{
link: '/',
icon: FaHome,
name: 'Home',
},
+ {
+ link: '/gerar-resumo',
+ icon: FaFileAlt,
+ name: 'Gerar resumo',
+ },
];
diff --git a/src/constants/sidebar/sidebar-items-footer.ts b/src/constants/sidebar/sidebar-items-footer.ts
index cf0e366..ed58e88 100644
--- a/src/constants/sidebar/sidebar-items-footer.ts
+++ b/src/constants/sidebar/sidebar-items-footer.ts
@@ -2,7 +2,7 @@ import { clearStorage } from '@/utils/storage/clear-storage';
import { IoMdSettings } from 'react-icons/io';
import { IoLogOut } from 'react-icons/io5';
-export const sidebarItemsFooter = [
+export const SIDEBAR_ITEMS_FOOTER = [
{
link: '/minha-conta',
icon: IoMdSettings,
diff --git a/src/service/auth-request.ts b/src/service/auth-request.ts
index 28cdaaf..7da597b 100644
--- a/src/service/auth-request.ts
+++ b/src/service/auth-request.ts
@@ -19,11 +19,12 @@ export async function authRequest(
data: response.data,
};
} catch (error: any) {
+ const errorMessage = error.response?.data?.error;
return {
success: false,
error: {
code: error.code,
- message: error.response?.data?.error,
+ message: errorMessage ?? 'Ocorreu um erro! Por favor, tente novamente mais tarde',
},
};
}
diff --git a/src/service/base-request.ts b/src/service/base-request.ts
index f7a7b9c..9a6ab3e 100644
--- a/src/service/base-request.ts
+++ b/src/service/base-request.ts
@@ -20,11 +20,12 @@ export async function baseRequest(
data: response.data,
};
} catch (error: any) {
+ const errorMessage = error.response?.data?.error;
return {
success: false,
error: {
code: error.code,
- message: error.response?.data?.error,
+ message: errorMessage ?? 'Ocorreu um erro! Por favor, tente novamente mais tarde',
},
};
}
diff --git a/src/service/my-account/patch-personal-informations.ts b/src/service/my-account/patch-personal-informations.ts
index e8ac5ee..053f851 100644
--- a/src/service/my-account/patch-personal-informations.ts
+++ b/src/service/my-account/patch-personal-informations.ts
@@ -1,14 +1,7 @@
+import { PersonalInformationData } from '@/app/(private)/minha-conta/personal-information-schema';
import { ApiResponse } from '@/types/ApiResponse';
import { baseRequest } from '../base-request';
-type PatchPersonalInformationsRequest = {
- password?: string;
- firstname?: string;
- lastname?: string;
-};
-
-export const patchPersonalInformations = (
- data: PatchPersonalInformationsRequest
-): Promise => {
+export const patchPersonalInformations = (data: PersonalInformationData): Promise => {
return baseRequest('patch', '/update_profile', data);
};
diff --git a/src/service/summary/generate-summary.ts b/src/service/summary/generate-summary.ts
new file mode 100644
index 0000000..77b2d89
--- /dev/null
+++ b/src/service/summary/generate-summary.ts
@@ -0,0 +1,8 @@
+import { SummaryData } from '@/app/(private)/gerar-resumo/summary-schema';
+import { ApiResponse } from '@/types/ApiResponse';
+import { baseRequest } from '../base-request';
+
+export const generateSummary = (data: SummaryData): Promise => {
+ const payload = { ...data, language_select: 'pt-BR' };
+ return baseRequest('post', '/summarize', payload, { responseType: 'blob' });
+};
diff --git a/tsconfig.json b/tsconfig.json
index c314871..909dff1 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,7 +1,11 @@
{
"compilerOptions": {
"target": "ES2017",
- "lib": ["dom", "dom.iterable", "esnext"],
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
@@ -12,7 +16,7 @@
"resolveJsonModule": true,
"isolatedModules": true,
"forceConsistentCasingInFileNames": true,
- "jsx": "preserve",
+ "jsx": "react-jsx",
"incremental": true,
"plugins": [
{
@@ -21,17 +25,43 @@
],
"baseUrl": "./src",
"paths": {
- "@/components/*": ["components/*"],
- "@/constants/*": ["constants/*"],
- "@/context/*": ["context/*"],
- "@/app/*": ["app/*"],
- "@/service/*": ["service/*"],
- "@/style/*": ["style/*"],
- "@/types/*": ["types/*"],
- "@/hooks/*": ["hooks/*"],
- "@/utils/*": ["utils/*"]
+ "@/components/*": [
+ "components/*"
+ ],
+ "@/constants/*": [
+ "constants/*"
+ ],
+ "@/context/*": [
+ "context/*"
+ ],
+ "@/app/*": [
+ "app/*"
+ ],
+ "@/service/*": [
+ "service/*"
+ ],
+ "@/style/*": [
+ "style/*"
+ ],
+ "@/types/*": [
+ "types/*"
+ ],
+ "@/hooks/*": [
+ "hooks/*"
+ ],
+ "@/utils/*": [
+ "utils/*"
+ ]
}
},
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
- "exclude": ["node_modules"]
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
}