You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

315 lines
6.1 KiB

import Assets from './assets';
import type { Skill, SkillCategory } from '../types';
import svelte from '../md/svelte.md?raw';
import { omit, type StringWithAutoComplete } from '@riadh-adrani/utils';
const defineSkillCategory = <S extends string>(data: SkillCategory<S>): SkillCategory<S> => data;
const categories = [
defineSkillCategory({ name: 'Langages de programmation', slug: 'pro-lang' }),
defineSkillCategory({ name: 'Frameworks', slug: 'framework' }),
defineSkillCategory({ name: 'Bibliothèques', slug: 'library' }),
defineSkillCategory({ name: 'Langages', slug: 'lang' }),
defineSkillCategory({ name: 'Bases de données', slug: 'db' }),
defineSkillCategory({ name: 'ORMs', slug: 'orm' }),
defineSkillCategory({ name: 'DevOps', slug: 'devops' }),
defineSkillCategory({ name: 'Testing', slug: 'test' }),
defineSkillCategory({ name: 'Outils', slug: 'devtools' }),
defineSkillCategory({ name: 'Balisage & Style', slug: 'markup-style' }),
defineSkillCategory({ name: 'Design', slug: 'design' }),
defineSkillCategory({ name: 'Soft Skills', slug: 'soft' })
] as const;
const defineSkill = <S extends string>(
skill: Omit<Skill<S>, 'category'> & {
category?: StringWithAutoComplete<(typeof categories)[number]['slug']>;
}
): Skill<S> => {
const out: Skill<S> = omit(skill, 'category');
if (skill.category) {
out.category = categories.find((it) => it.slug === skill.category);
}
return out;
};
export const items = [
defineSkill({
slug: 'js',
color: 'yellow',
description:
'',
logo: Assets.JavaScript,
name: 'Javascript',
category: 'pro-lang'
}),
defineSkill({
slug: 'ts',
color: 'blue',
description:
'',
logo: Assets.TypeScript,
name: 'Typescript',
category: 'pro-lang'
}),
defineSkill({
slug: 'dart',
color: 'cyan',
description:
'',
logo: Assets.Dart,
name: 'Dart',
category: 'pro-lang'
}),
defineSkill({
slug: 'java',
color: 'orange',
description:
'',
logo: Assets.Java,
name: 'Java',
category: 'pro-lang'
}),
defineSkill({
slug: 'csharp',
color: 'purple',
description:
'',
logo: Assets.CSharp,
name: 'C#',
category: 'pro-lang'
}),
defineSkill({
slug: 'python',
color: 'blue',
description:
'',
logo: Assets.Python,
name: 'Python',
category: 'pro-lang'
}),
defineSkill({
slug: 'c',
color: 'blue',
description:
'',
logo: Assets.C,
name: 'C',
category: 'pro-lang'
}),
defineSkill({
slug: 'cpp',
color: 'blue',
description:
'',
logo: Assets.Cpp,
name: 'C++',
category: 'pro-lang'
}),
defineSkill({
slug: 'php',
color: 'blue',
description:
'',
logo: Assets.PHP,
name: 'PHP',
category: 'pro-lang'
}),
defineSkill({
slug: 'kotlin',
color: 'purple',
description:
'',
logo: Assets.Kotlin,
name: 'Kotlin',
category: 'pro-lang'
}),
defineSkill({
slug: 'css',
color: 'blue',
description:
'',
logo: Assets.CSS,
name: 'CSS',
category: 'markup-style'
}),
defineSkill({
slug: 'html',
color: 'orange',
description:
'',
logo: Assets.HTML,
name: 'HTML',
category: 'markup-style'
}),
defineSkill({
slug: 'sass',
color: 'pink',
description:
'',
logo: Assets.Sass,
name: 'Sass',
category: 'markup-style'
}),
defineSkill({
slug: 'flutter',
color: 'cyan',
description:
'',
logo: Assets.Flutter,
name: 'Flutter',
category: 'framework'
}),
defineSkill({
slug: 'vuejs',
color: 'green',
description:
'',
logo: Assets.VueJs,
name: 'VueJS',
category: 'framework'
}),
defineSkill({
slug: 'react-native',
color: 'cyan',
description:
'',
logo: Assets.ReactJs,
name: 'React Native',
category: 'framework'
}),
defineSkill({
slug: 'quasar-framework',
color: 'blue',
description:
'',
logo: Assets.Quasar,
name: 'Quasar Framework',
category: 'framework'
}),
defineSkill({
slug: 'reactjs',
color: 'cyan',
description:
'',
logo: Assets.ReactJs,
name: 'React Js',
category: 'library'
}),
defineSkill({
slug: 'postgresql',
color: 'blue',
description:
'',
logo: Assets.PostgreSQL,
name: 'PostgreSQL',
category: 'db'
}),
defineSkill({
slug: 'mongodb',
color: 'green',
description:
'',
logo: Assets.MongoDB,
name: 'MongoDB',
category: 'db'
}),
defineSkill({
slug: 'vscode',
color: 'blue',
description:
'',
logo: Assets.VisualStudioCode,
name: 'Visual Studio Code',
category: 'tools'
}),
defineSkill({
slug: 'visualstudio',
color: 'purple',
description:
'',
logo: Assets.VisualStudio,
name: 'Visual Studio',
category: 'tools'
}),
defineSkill({
slug: 'jetbrains',
color: 'black',
description:
'',
logo: Assets.JetBrains,
name: 'Suite JetBrains',
category: 'tools'
}),
defineSkill({
slug: 'git',
color: 'orange',
description:
'',
logo: Assets.Git,
name: 'Git',
category: 'tools'
}),
defineSkill({
slug: 'docker',
color: 'blue',
description:
'',
logo: Assets.Docker,
name: 'Docker',
category: 'tools'
}),
defineSkill({
slug: 'photoshop',
color: 'cyan',
description:
'',
logo: Assets.Photoshop,
name: 'Photoshop',
category: 'tools'
}),
] as const;
export const title = 'Compétences';
export const getSkills = (
...slugs: Array<StringWithAutoComplete<(typeof items)[number]['slug']>>
): Array<Skill> => items.filter((it) => slugs.includes(it.slug));
export const groupByCategory = (
query: string
): Array<{ category: SkillCategory; items: Array<Skill> }> => {
const out: ReturnType<typeof groupByCategory> = [];
const others: Array<Skill> = [];
items.forEach((item) => {
if (query.trim() && !item.name.toLowerCase().includes(query.trim().toLowerCase())) return;
// push to others if item does not have a category
if (!item.category) {
console.log(item.category);
others.push(item);
return;
}
// check if category exists
let category = out.find((it) => it.category.slug === item.category?.slug);
if (!category) {
category = { items: [], category: item.category };
out.push(category);
}
category.items.push(item);
});
if (others.length !== 0) {
out.push({ category: { name: 'Others', slug: 'others' }, items: others });
}
return out;
};