Skip to content

Conversation

@gocanto
Copy link
Contributor

@gocanto gocanto commented Jul 15, 2025

Summary by CodeRabbit

  • New Features
    • Added professional recommendations to user profiles, including detailed testimonials, relationship context, and information about the recommending person. Users can now view a richer set of professional endorsements on profiles.
    • Introduced comprehensive educational background details to user profiles, showcasing schools, degrees, fields of study, descriptions, graduation years, and issuing countries.
    • Enhanced the resume page to display dynamic recommendations and education sections only when user data is available.
    • Updated the recommendations section to dynamically render multiple endorsements with associated avatars and details for a more interactive experience.
    • Refined the education section to dynamically present education entries with formatted descriptions and graduation years.
  • Improvements
    • Replaced newsletter widgets with skills widgets on multiple pages for a more relevant sidebar experience.
    • Removed the "subscribe" navigation item from the sidebar menu to streamline navigation.
    • Improved date formatting and markdown rendering for recommendations and education descriptions for better readability.

@coderabbitai
Copy link

coderabbitai bot commented Jul 15, 2025

Walkthrough

The user data model has been extended with two new properties: recommendations and education. Corresponding TypeScript interfaces for Recommendation, RecommendationPerson, and Education were added, and the exported user response object now includes arrays of detailed professional recommendations and educational background records. The RecommendationPartial and EducationPartial components were refactored to render dynamically from passed props, with markdown parsing and sanitization. Their usage in ResumePage.vue was updated to conditionally render with data binding. The <AwardsPartial /> component was removed. Additionally, dependencies marked and dompurify were added for markdown parsing and sanitization. A new utility function date was introduced for date formatting. The newsletter widget was replaced by a skills widget on multiple pages, and the subscribe navigation item was removed from the sidebar.

Changes

File(s) Change Summary
src/stores/users/userType.ts Added Recommendation, RecommendationPerson, and Education interfaces; updated User interface with recommendations and education arrays.
src/stores/users/response.ts Added recommendations and education properties to the exported user response, populated with detailed recommendation and education objects.
src/pages/ResumePage.vue Removed <AwardsPartial />; conditionally rendered <RecommendationPartial /> and <EducationPartial /> with props bound to user.recommendations and user.education.
src/partials/RecommendationPartial.vue Refactored to dynamically render recommendations from a typed recommendations prop; replaced static content with data-driven markup; added <script setup lang="ts"> with markdown parsing and sanitization; imported marked, DOMPurify, image, and date.
src/partials/EducationPartial.vue Converted to <script setup lang="ts">; dynamically render education items from typed education prop with markdown parsing and sanitization; replaced static entries with a loop; updated icon rendering and date format.
src/pages/AboutPage.vue, src/pages/HomePage.vue, src/pages/PostPage.vue, src/pages/ProjectsPage.vue Replaced WidgetNewsletterPartial with WidgetSkillsPartial in right sidebar; updated imports accordingly.
src/partials/SideNavPartial.vue Removed the "subscribe" navigation item from the sidebar menu.
package.json Added dependencies: dompurify (^3.2.6) and marked (^16.0.0) for safe markdown rendering.
src/public.ts Added exported function date for configurable date formatting using Intl.DateTimeFormat.

Poem

In the meadow of code where users reside,
New tales of praise now hop inside.
Recommendations bloom, with stories to share,
Of colleagues and friends, and wisdom laid bare.
With every new field, our network expands—
A warren of trust, built by many hands!
🐇✨

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

npm error Exit handler never called!
npm error This is an error with npm itself. Please report this error at:
npm error https://github.com/npm/cli/issues
npm error A complete log of this run can be found in: /.npm/_logs/2025-07-15T06_38_52_817Z-debug-0.log


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 62d4f98 and da2de9f.

⛔ Files ignored due to path filters (1)
  • public/favicon.ico is excluded by !**/*.ico
📒 Files selected for processing (5)
  • src/pages/AboutPage.vue (2 hunks)
  • src/pages/HomePage.vue (2 hunks)
  • src/pages/PostPage.vue (2 hunks)
  • src/pages/ProjectsPage.vue (2 hunks)
  • src/partials/SideNavPartial.vue (0 hunks)
💤 Files with no reviewable changes (1)
  • src/partials/SideNavPartial.vue
✅ Files skipped from review due to trivial changes (4)
  • src/pages/ProjectsPage.vue
  • src/pages/HomePage.vue
  • src/pages/AboutPage.vue
  • src/pages/PostPage.vue

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
src/stores/users/response.ts (3)

1-1: Remove the file-extension from the path alias import

Most TS path-mappers treat @stores/... as a module name; including .ts can break resolution under common bundlers (ts-node, Vite, Webpack).

-import { User } from '@stores/users/userType.ts';
+import { User } from '@stores/users/userType';

286-301: Multi-paragraph text is easier to read & maintain with template literals

String-concatenation plus \n harms readability and invites “+ "\n" +` noise.
Use a back-tick template literal instead:

-			text: "Gus and I were peers at Perx during his time as Head of Engineering, he led several key initiatives — from scaling the engineering team and aligning cross-functional efforts across DevOps, backend, frontend, and data, to driving projects around infrastructure modernization, performance optimization, and cloud cost efficiency.\n" +
-				"\n" +
-				"He’s a hands-on and technically strong leader who enjoys solving complex engineering problems. Outside of work, Gustavo is highly disciplined when it comes to health and fitness — always consistent and focused, which says a lot about his overall approach to life and work.",
+			text: `Gus and I were peers at Perx during his time as Head of Engineering, he led several key initiatives — from scaling the engineering team and aligning cross-functional efforts across DevOps, backend, frontend, and data, to driving projects around infrastructure modernization, performance optimization, and cloud cost efficiency.

+He’s a hands-on and technically strong leader who enjoys solving complex engineering problems. Outside of work, Gustavo is highly disciplined when it comes to health and fitness — always consistent and focused, which says a lot about his overall approach to life and work.`,

362-366: Typo: “Engineering Manger” → “Engineering Manager”

-				designation: "Engineering Manger",
+				designation: "Engineering Manager",
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2809a8d and 8c9f2f9.

⛔ Files ignored due to path filters (9)
  • public/images/recommendation/amrith-g.jpeg is excluded by !**/*.jpeg
  • public/images/recommendation/bhupesh-pathak.jpeg is excluded by !**/*.jpeg
  • public/images/recommendation/claudio-reggiani.jpeg is excluded by !**/*.jpeg
  • public/images/recommendation/damien-passavent.jpeg is excluded by !**/*.jpeg
  • public/images/recommendation/dawid-makowski.jpeg is excluded by !**/*.jpeg
  • public/images/recommendation/jarek-tkaczyk.jpeg is excluded by !**/*.jpeg
  • public/images/recommendation/kong-kw.jpg is excluded by !**/*.jpg
  • public/images/recommendation/ross-riley.jpeg is excluded by !**/*.jpeg
  • public/images/recommendation/victory-sometime.jpeg is excluded by !**/*.jpeg
📒 Files selected for processing (2)
  • src/stores/users/response.ts (1 hunks)
  • src/stores/users/userType.ts (2 hunks)
🔇 Additional comments (2)
src/stores/users/userType.ts (2)

49-56: Interfaces look solid – consistent with the existing style.

Fields, naming, and typing align with the rest of the model.
No issues spotted.


65-77: No breaking callers found — keeping recommendations required is safe
A search for all object literals assigned to User, as User casts, Partial<User>, and test mocks turned up only one instantiation:

  • src/stores/users/response.ts: export const Response: User = { … } (includes both talks and recommendations)

Since no other call-sites construct a User without the recommendations array, making it optional isn’t necessary.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
src/stores/users/userType.ts (2)

58-63: Consider making some RecommendationPerson fields optional.

While the interface structure is sound, some fields might not always be available or relevant:

 export interface RecommendationPerson {
-	avatar: string;
+	avatar?: string;
 	full_name: string;
 	company: string;
 	designation: string;
 }

The avatar field could be optional since profile images aren't always available for recommendation sources.


65-74: Education interface is comprehensive but consider optional fields.

The interface covers educational background thoroughly. However, some fields might benefit from being optional to handle varying data completeness:

 export interface Education {
 	uuid: string;
-	icon: string;
+	icon?: string;
 	school: string;
 	degree: string;
 	field: string;
-	description: string;
+	description?: string;
 	graduated_at: string;
 	issuing_country: string;
 }

Fields like icon and description might not always be available or required for all educational records.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8c9f2f9 and 8b4b657.

⛔ Files ignored due to path filters (2)
  • public/images/education/iut_valencia.jpeg is excluded by !**/*.jpeg
  • public/images/education/uah_logo.jpeg is excluded by !**/*.jpeg
📒 Files selected for processing (2)
  • src/stores/users/response.ts (1 hunks)
  • src/stores/users/userType.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/stores/users/response.ts
🔇 Additional comments (2)
src/stores/users/userType.ts (2)

49-56: Well-structured recommendation interface with good separation of concerns.

The Recommendation interface effectively models professional recommendations with appropriate fields. The separation of person details into a dedicated RecommendationPerson interface promotes reusability and maintains clean data structure.


83-83: User interface integration is correct and maintains consistency.

The addition of education and recommendations arrays to the User interface is properly typed and follows the established pattern of other array properties in the interface.

Also applies to: 88-88

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
src/partials/RecommendationPartial.vue (1)

18-18: Consider formatting the date for better user experience.

The created_at field likely contains a raw timestamp that should be formatted for display.

Consider using a date formatting utility:

-<div>{{ item.created_at }}</div>
+<div>{{ new Date(item.created_at).toLocaleDateString() }}</div>

Or import a date formatting library for more control over the display format.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8b4b657 and 5950cbc.

📒 Files selected for processing (2)
  • src/pages/ResumePage.vue (1 hunks)
  • src/partials/RecommendationPartial.vue (1 hunks)
🔇 Additional comments (3)
src/pages/ResumePage.vue (1)

21-21: LGTM! Consistent pattern implementation.

The conditional rendering and prop binding follow the same pattern as ExperiencePartial on line 24, ensuring consistency across the codebase. The v-if="user" prevents potential runtime errors when the user data is not yet loaded.

src/partials/RecommendationPartial.vue (2)

6-6: LGTM! Proper Vue.js list rendering implementation.

The dynamic rendering with v-for and item.uuid as the key follows Vue.js best practices for list performance and reactivity.


30-37: LGTM! Proper TypeScript integration.

The script setup with typed props follows Vue 3 Composition API best practices and ensures type safety for the recommendations data.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/public.ts (1)

10-14: Fix formatting inconsistencies and missing semicolon.

There are formatting issues in the options object: inconsistent spacing around colons and a missing semicolon.

 	const ops = options || {
-		year:  "numeric",
-		month: "long",
-		day:   "numeric"
-	}
+		year: "numeric",
+		month: "long",
+		day: "numeric"
+	};
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2e2529e and fe85f4b.

📒 Files selected for processing (3)
  • src/partials/RecommendationPartial.vue (1 hunks)
  • src/public.ts (1 hunks)
  • src/stores/users/response.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/partials/RecommendationPartial.vue
  • src/stores/users/response.ts
🔇 Additional comments (1)
src/public.ts (1)

7-17: LGTM! Solid utility function implementation.

The function logic is well-structured with appropriate defaults and fallback handling. The default date format (numeric year, long month, numeric day) provides good readability for recommendation dates.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/partials/EducationPartial.vue (1)

15-28: Consider making the icon dynamic instead of hardcoded.

The SVG icon is now hardcoded, but the education data structure includes an icon property that could be used to display different icons for different education types (e.g., university vs. certification).

Consider conditionally rendering the icon based on the item data:

-						<svg
-							xmlns="http://www.w3.org/2000/svg"
-							fill="none"
-							viewBox="0 0 24 24"
-							stroke-width="1.5"
-							stroke="currentColor"
-							class="opacity-30 size-8 dark:opacity-30 fill-none text-fuchsia-500 dark:text-white"
-						>
-							<path
-								stroke-linecap="round"
-								stroke-linejoin="round"
-								d="M4.26 10.147a60.438 60.438 0 0 0-.491 6.347A48.62 48.62 0 0 1 12 20.904a48.62 48.62 0 0 1 8.232-4.41 60.46 60.46 0 0 0-.491-6.347m-15.482 0a50.636 50.636 0 0 0-2.658-.813A59.906 59.906 0 0 1 12 3.493a59.903 59.903 0 0 1 10.399 5.84c-.896.248-1.783.52-2.658.814m-15.482 0A50.717 50.717 0 0 1 12 13.489a50.702 50.702 0 0 1 7.74-3.342M6.75 15a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm0 0v-3.675A55.378 55.378 0 0 1 12 8.443m-7.007 11.55A5.981 5.981 0 0 0 6.75 15.75v-1.5"
-							/>
-						</svg>
+						<img v-if="item.icon" :src="item.icon" :alt="`${item.school} icon`" class="opacity-30 size-8 dark:opacity-30" />
+						<svg
+							v-else
+							xmlns="http://www.w3.org/2000/svg"
+							fill="none"
+							viewBox="0 0 24 24"
+							stroke-width="1.5"
+							stroke="currentColor"
+							class="opacity-30 size-8 dark:opacity-30 fill-none text-fuchsia-500 dark:text-white"
+						>
+							<path
+								stroke-linecap="round"
+								stroke-linejoin="round"
+								d="M4.26 10.147a60.438 60.438 0 0 0-.491 6.347A48.62 48.62 0 0 1 12 20.904a48.62 48.62 0 0 1 8.232-4.41 60.46 60.46 0 0 0-.491-6.347m-15.482 0a50.636 50.636 0 0 0-2.658-.813A59.906 59.906 0 0 1 12 3.493a59.903 59.903 0 0 1 10.399 5.84c-.896.248-1.783.52-2.658.814m-15.482 0A50.717 50.717 0 0 1 12 13.489a50.702 50.702 0 0 1 7.74-3.342M6.75 15a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm0 0v-3.675A55.378 55.378 0 0 1 12 8.443m-7.007 11.55A5.981 5.981 0 0 0 6.75 15.75v-1.5"
+							/>
+						</svg>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fe85f4b and a54dc3e.

📒 Files selected for processing (4)
  • src/pages/ResumePage.vue (1 hunks)
  • src/partials/EducationPartial.vue (1 hunks)
  • src/partials/RecommendationPartial.vue (1 hunks)
  • src/stores/users/response.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/pages/ResumePage.vue
  • src/partials/RecommendationPartial.vue
  • src/stores/users/response.ts
🔇 Additional comments (4)
src/partials/EducationPartial.vue (4)

6-6: LGTM: Proper v-for implementation with key binding.

The dynamic rendering implementation correctly uses item.uuid as the key, which ensures proper Vue reactivity and list reconciliation.


32-35: LGTM: Clean data binding implementation.

The dynamic rendering of education data with proper property binding is well-implemented. The use of v-html with sanitized content is a secure approach.


49-51: LGTM: Proper TypeScript prop definition.

The props definition correctly uses TypeScript typing with the imported Education interface, ensuring type safety.


53-62: LGTM: Well-structured computed property with security considerations.

The computed property efficiently processes education data and properly sanitizes HTML output using DOMPurify, which prevents XSS attacks when using v-html.

@gocanto gocanto changed the title Feature/resume [feature] Resumen page Jul 15, 2025
@gocanto gocanto merged commit e953db6 into main Jul 15, 2025
1 check passed
@coderabbitai coderabbitai bot mentioned this pull request Jul 23, 2025
@coderabbitai coderabbitai bot mentioned this pull request Sep 17, 2025
@gocanto gocanto deleted the feature/resume branch October 3, 2025 04:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants