From 224fd31839b4ad388a63e650b4843643c3d7deef Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Sun, 4 May 2025 00:38:56 -0600 Subject: [PATCH] Resume page --- components/HomeButtonLinks.tsx | 2 +- fresh.gen.ts | 2 + islands/NavigationBar.tsx | 12 + routes/resume.tsx | 239 ++++++++++++++++ static/files/resume.json | 483 +++++++++++++++++++++++++++++++++ 5 files changed, 737 insertions(+), 1 deletion(-) create mode 100644 routes/resume.tsx create mode 100644 static/files/resume.json diff --git a/components/HomeButtonLinks.tsx b/components/HomeButtonLinks.tsx index a6cc2f9..36cb438 100644 --- a/components/HomeButtonLinks.tsx +++ b/components/HomeButtonLinks.tsx @@ -2,7 +2,7 @@ export default function HomeButtonLinks() { return (
+
  • + +
    + +
    +
    +
  • +
  • = { + async GET(_req, ctx) { + try { + const resp = await fetch(new URL("/files/resume.json", ctx.url).href); + if (!resp.ok) { + console.error(`Error fetching resume.json: ${resp.status} ${resp.statusText}`); + return ctx.render(undefined); + } + const resumeData: ResumeData = await resp.json(); + const skillsSection = resumeData.sections.skills; + if (skillsSection && skillsSection.items) { + const tsSkill = skillsSection.items.find(s => s.name === "Typescrpt"); + if (tsSkill) { + tsSkill.name = "Typescript"; + } + } + return ctx.render(resumeData); + } catch (error) { + console.error("Error processing resume data:", error); + return ctx.render(undefined); + } + }, +}; + +export default function ResumePage({ data }: PageProps) { + if (!data) { + return ( + <> + Error Loading Resume +
    +

    Error loading resume data.

    +

    Please try refreshing the page.

    +
    + + ); + } + + const { basics, sections } = data; + const { summary, profiles, skills, experience, education, volunteer } = sections; + + return ( + <> + + {basics.name} - Resume + + +
    +

    {basics.name}

    + + {/* Contact Info */} +
    + + {/* Download Resume Button */} + + + {/* Summary Card */} + {summary && ( +
    +
    +

    {summary.name || "Summary"}

    +
    +
    +
    + )} + + {/* Profiles Card */} + {profiles && profiles.items && profiles.items.length > 0 && ( +
    +
    +

    {profiles.name || "Profiles"}

    +
    + {profiles.items.map((profile) => { + let IconComponent = LuGlobe; + const networkLower = profile.network.toLowerCase(); + if (networkLower === "github") IconComponent = LuGithub; + else if (networkLower === "linkedin") IconComponent = LuLinkedin; + else if (networkLower === "forgejo") IconComponent = LuGitBranch; + + return ( + + {profile.network} ({profile.username}) + + ); + })} +
    +
    +
    + )} + + {/* Skills Card */} + {skills && skills.items && skills.items.length > 0 && ( +
    +
    +

    {skills.name || "Skills"}

    +
    + {skills.items.map((skill) => ( +
    + + + +
    + ))} +
    +
    +
    + )} + + {/* Experience Card */} + {experience && experience.items && experience.items.length > 0 && ( +
    +
    +

    {experience.name || "Experience"}

    +
    + {experience.items.map((exp, index) => ( +
    + +
    + {exp.position} at {exp.company} ({exp.date}) + {exp.location && ( + {exp.location} + )} +
    +
    + {exp.url && exp.url.href && ( + {exp.url.href} + )} +
    +
    +
    + ))} +
    +
    +
    + )} + + {/* Education Card */} + {education && education.items && education.items.length > 0 && ( +
    +
    +

    {education.name || "Education"}

    +
    + {education.items.map((edu, index) => ( +
    +

    {edu.institution}

    +

    {edu.studyType} - {edu.area} ({edu.date})

    + {edu.summary && ( +
    + )} +
    + ))} +
    +
    +
    + )} + + {/* Volunteering Card */} + {volunteer && volunteer.items && volunteer.items.length > 0 && ( +
    +
    +

    {volunteer.name || "Volunteering"}

    +
    + {volunteer.items.map((vol, index) => ( +
    +

    {vol.organization}

    +

    {vol.position} ({vol.date})

    +
    + ))} +
    +
    +
    + )} + +
    + + ); +} \ No newline at end of file diff --git a/static/files/resume.json b/static/files/resume.json new file mode 100644 index 0000000..674dfec --- /dev/null +++ b/static/files/resume.json @@ -0,0 +1,483 @@ +{ + "basics": { + "url": { + "href": "https://atri.dad", + "label": "" + }, + "name": "Atridad Lahijjjjj", + "email": "me@atri.dad", + "phone": "", + "picture": { + "url": "", + "size": 64, + "effects": { + "border": false, + "hidden": false, + "grayscale": false + }, + "aspectRatio": 1, + "borderRadius": 0 + }, + "headline": "", + "location": "", + "customFields": [] + }, + "metadata": { + "css": { + "value": ".text-2xl {\n\tfont-size: 30px;\n}", + "visible": true + }, + "page": { + "format": "letter", + "margin": 16, + "options": { + "breakLine": true, + "pageNumbers": true + } + }, + "notes": "", + "theme": { + "text": "#000000", + "primary": "#0284c7", + "background": "#ffffff" + }, + "layout": [ + [ + [ + "summary", + "education", + "experience", + "projects", + "references", + "custom.b5li7wh27iylvqlsmeavvkzh" + ], + [ + "profiles", + "skills", + "volunteer", + "interests", + "certifications", + "awards", + "publications", + "languages" + ] + ] + ], + "template": "glalie", + "typography": { + "font": { + "size": 14, + "family": "Lato", + "subset": "latin", + "variants": [ + "regular" + ] + }, + "hideIcons": false, + "lineHeight": 0.95, + "underlineLinks": true + } + }, + "sections": { + "awards": { + "id": "awards", + "name": "Awards", + "items": [], + "columns": 1, + "visible": true, + "separateLinks": true + }, + "custom": { + "b5li7wh27iylvqlsmeavvkzh": { + "id": "b5li7wh27iylvqlsmeavvkzh", + "name": "Custom Section", + "items": [], + "columns": 1, + "visible": true, + "separateLinks": true + } + }, + "skills": { + "id": "skills", + "name": "Skills", + "items": [ + { + "id": "lpwyb43emmmukje3c49yupu7", + "name": "HTML + CSS + JavaScript", + "level": 5, + "visible": true, + "keywords": [], + "description": "" + }, + { + "id": "c5qu0q3wct06oj1wa3u3tkar", + "visible": true, + "name": "Typescrpt", + "description": "", + "level": 5, + "keywords": [] + }, + { + "id": "qtq2qfeoa0bskykwhfzmlpng", + "visible": true, + "name": "Vitest, Jest, and Playwright", + "description": "", + "level": 4, + "keywords": [] + }, + { + "id": "b6k6q4r592uesacsz03dtvyk", + "visible": true, + "name": "Docker + Docker Compose", + "description": "", + "level": 5, + "keywords": [] + }, + { + "id": "lc3eu9r8vvqhsst1mkeqxgse", + "visible": true, + "name": "Go (Golang)", + "description": "", + "level": 4, + "keywords": [] + }, + { + "id": "lme3ob0kfpe5hgsuar42nmi6", + "visible": true, + "name": "SQL (PostgreSQL, MySQL, SQLite)", + "description": "", + "level": 4, + "keywords": [] + }, + { + "id": "f58rq48rtsgdftfcbpt785is", + "visible": true, + "name": "Python", + "description": "", + "level": 4, + "keywords": [] + }, + { + "id": "ht9fn1i89gm0e3gf5mfde0os", + "visible": true, + "name": "SCRUM", + "description": "", + "level": 5, + "keywords": [] + }, + { + "id": "vtpxeg6r0os9ygjmg384wo7f", + "visible": true, + "name": "Amazon Web Services (AWS)", + "description": "", + "level": 4, + "keywords": [] + }, + { + "id": "tk3i1xdw92vny0fk7001rrj7", + "visible": true, + "name": "Ruby", + "description": "", + "level": 2, + "keywords": [] + }, + { + "id": "jqy6vkxl8hed4vgow0z12vwy", + "visible": true, + "name": "Test Driven Development", + "description": "", + "level": 3, + "keywords": [] + }, + { + "id": "oalwcevey6plalwasugwf4q7", + "visible": true, + "name": "C#", + "description": "", + "level": 3, + "keywords": [] + }, + { + "id": "skhsek829sf8012wbwd38fl8", + "visible": true, + "name": "PHP", + "description": "", + "level": 2, + "keywords": [] + }, + { + "id": "feotadkdeli1ukx3u3ix86ig", + "name": "Time Management", + "level": 4, + "visible": true, + "keywords": [], + "description": "" + }, + { + "id": "a993l06kuyinj9l88uz3ztux", + "name": "Problem Solving", + "level": 5, + "visible": true, + "keywords": [], + "description": "" + }, + { + "id": "rhyu2toaznnidknrz244klqq", + "name": "Attention to Detail", + "level": 5, + "visible": true, + "keywords": [], + "description": "" + } + ], + "columns": 1, + "visible": true, + "separateLinks": true + }, + "summary": { + "id": "summary", + "name": "Summary", + "columns": 1, + "content": "

    I am a full-stack web developer and researcher with a background maintaining and developing for large-scale enterprise software systems. I am in the process of completing my Master of Science in Computer Science under the supervision of Dr. Nathaniel Osgood at the University of Saskatchewan. I have completed my course work and am now moving into writing my thesis which can be done asynchronously.

    ", + "visible": true, + "separateLinks": true + }, + "profiles": { + "id": "profiles", + "name": "Profiles", + "items": [ + { + "id": "zuto1s9atwo6tdx9qfa9ggug", + "url": { + "href": "https://github.com/atridadl", + "label": "" + }, + "icon": "github", + "network": "GitHub", + "visible": true, + "username": "atridadl" + }, + { + "id": "satbehrw5da07dmi8y8j70kl", + "url": { + "href": "https://www.linkedin.com/in/atridadl/", + "label": "" + }, + "icon": "linkedin", + "network": "linkedin", + "visible": true, + "username": "atridadl" + }, + { + "id": "yorfn8ku98u5o0jzvumo9q2v", + "url": { + "href": "https://git.atri.dad/atridad", + "label": "" + }, + "icon": "forgejo", + "network": "Forgejo", + "visible": true, + "username": "atridad" + } + ], + "columns": 1, + "visible": true, + "separateLinks": true + }, + "projects": { + "id": "projects", + "name": "Projects", + "items": [], + "columns": 1, + "visible": true, + "separateLinks": true + }, + "education": { + "id": "education", + "name": "Education", + "items": [ + { + "id": "xtkfnu2zq3myh09pumehphx9", + "url": { + "href": "", + "label": "" + }, + "area": "Computer Science", + "date": "2024 – Present", + "score": "", + "summary": "

    Supervisor: Dr. Nathaniel Osgood

    • CMPT 838: Computer Security

    • CMPT 815: Computer Systems and Performance Evaluation

    ", + "visible": true, + "studyType": "Masters", + "institution": "University of Saskatchewan" + }, + { + "id": "o4my8au0d7c6bf09vlqwxvyw", + "url": { + "href": "", + "label": "" + }, + "area": "Computer Science", + "date": "2017 – 2019", + "score": "", + "summary": "", + "visible": true, + "studyType": "Bachelors (3 Year)", + "institution": "University of Saskatchewan" + }, + { + "id": "pnwpsei7ag1yldmtv9f4kt4e", + "url": { + "href": "", + "label": "" + }, + "area": "Computer Engineering", + "date": "2012 – 2017", + "score": "", + "summary": "", + "visible": true, + "studyType": "Bachelors", + "institution": "University of Saskatchewan" + } + ], + "columns": 1, + "visible": true, + "separateLinks": true + }, + "interests": { + "id": "interests", + "name": "Interests", + "items": [], + "columns": 1, + "visible": true, + "separateLinks": true + }, + "languages": { + "id": "languages", + "name": "Languages", + "items": [], + "columns": 1, + "visible": true, + "separateLinks": true + }, + "volunteer": { + "id": "volunteer", + "name": "Volunteering", + "items": [ + { + "id": "xhg1p7exqggrjkldszplj1wk", + "url": { + "href": "", + "label": "" + }, + "date": "2021 – 2022", + "summary": "", + "visible": true, + "location": "", + "position": "Mentor", + "organization": "Big Brother Big Sisters" + } + ], + "columns": 1, + "visible": true, + "separateLinks": true + }, + "experience": { + "id": "experience", + "name": "Experience", + "items": [ + { + "id": "gn67fi9oygi5tz1x3p3r7mbf", + "url": { + "href": "https://atash.dev", + "label": "" + }, + "date": "June 2019 – Present", + "company": "Atash Consulting", + "summary": "
    • Builds mobile and web applications for small-medium sized businesses

    • Provides consulting on as application development, system architecture, DevOps, etc

    • Hosting websites for small-medium sized businesses

    ", + "visible": true, + "location": "Edmonton, Alberta", + "position": "Owner/Developer" + }, + { + "id": "x8ok2hutceh7lroyhwa7kj0h", + "url": { + "href": "", + "label": "" + }, + "date": "November 2023 – Present", + "company": "University of Saskatchewan CEPHIL Lab", + "summary": "
    • Developing mobile and web applications

    • Coordinating with other grant researchers to deliver a minimum viable product

    • Gathering requirements from stakeholders to craft a product timeline

    • Acting as a technical lead and supervisor to a developer intern

    ", + "visible": true, + "location": "Saskatoon, Saskatchewan", + "position": "Research Technician" + }, + { + "id": "f0kyaxcy3syb8wazs3ye662i", + "url": { + "href": "", + "label": "" + }, + "date": "August 2021 – November 2023", + "company": "Alberta Motor Association", + "summary": "
    • Developed and maintained internal enterprise-level business applications leveraging Amazon Web Services (AWS)

    • Used React and Create React App (CRA) for standalone applications and micro-front-ends

    • Developed an in-house payment gateway for all AMA services that integrates with Stripe

    • Provided tier 3 support support for internal service

    • Participated in a bi-monthly 24/7 on-call rotation

    • Mentored students in the organization’s Developer in Training program

    ", + "visible": true, + "location": "Edmonton, Alberta", + "position": "Software Developer II" + }, + { + "id": "yikqef72i068lfiy8iiwjm45", + "url": { + "href": "", + "label": "" + }, + "date": "October 2019 – August 2021", + "company": "University of Alberta IST", + "summary": "
    • Front-end development of web applications using Vue.js

    • Leveraged Amazon Web Services to adopt a serverless architecture

    • Maintained a secure exam application developed in-house

    • Monitored and maintained an exam scheduling system hosted on-premises

    ", + "visible": true, + "location": "Edmonton, Alberta", + "position": "Software Developer" + }, + { + "id": "wzqfv3h8rxs6574z5hlvrhm7", + "url": { + "href": "", + "label": "" + }, + "date": "July 2017 – October 2019", + "company": "University of Alberta IST", + "summary": "
    • Provided support for our Moodle installation to students, faculty, and staff

    • Front-end development of web applications using Vue.js

    ", + "visible": true, + "location": "Edmonton, Alberta", + "position": "Support Analyst" + } + ], + "columns": 1, + "visible": true, + "separateLinks": true + }, + "references": { + "id": "references", + "name": "References", + "items": [], + "columns": 1, + "visible": true, + "separateLinks": true + }, + "publications": { + "id": "publications", + "name": "Publications", + "items": [], + "columns": 1, + "visible": true, + "separateLinks": true + }, + "certifications": { + "id": "certifications", + "name": "Certifications", + "items": [], + "columns": 1, + "visible": true, + "separateLinks": true + } + } + } \ No newline at end of file