mirror of
https://github.com/ershisan99/vacancies-trends-front.git
synced 2026-01-31 12:35:43 +00:00
get keywords from api to avoid duplication, optimize some code
This commit is contained in:
@@ -1,71 +0,0 @@
|
||||
export const KEYWORDS = {
|
||||
BACKEND: [
|
||||
'node.js',
|
||||
'nestjs',
|
||||
'nest.js',
|
||||
'go',
|
||||
'.net',
|
||||
'asp.net',
|
||||
'java',
|
||||
'express',
|
||||
'django',
|
||||
'laravel',
|
||||
'php',
|
||||
],
|
||||
LANGUAGES: [
|
||||
'typescript',
|
||||
'javascript',
|
||||
'python',
|
||||
'java',
|
||||
'c#',
|
||||
'c++',
|
||||
'c',
|
||||
'php',
|
||||
'ruby',
|
||||
'go',
|
||||
'kotlin',
|
||||
'swift',
|
||||
'objective-c',
|
||||
],
|
||||
ORM: ['typeorm', 'prisma', 'sequelize', 'drizzle'],
|
||||
get FRONTEND() {
|
||||
return [
|
||||
...this.FRONTEND_FRAMEWORK,
|
||||
...this.STYLES,
|
||||
...this.STATE_MANAGEMENT,
|
||||
...this.TESTING,
|
||||
'fsd',
|
||||
]
|
||||
},
|
||||
FRONTEND_FRAMEWORK: [
|
||||
'html',
|
||||
'nuxt',
|
||||
'react',
|
||||
'remix',
|
||||
'angular',
|
||||
'vue',
|
||||
'jquery',
|
||||
'svelte',
|
||||
'nextjs',
|
||||
'next.js',
|
||||
],
|
||||
STYLES: ['css', 'sass', 'tailwind', 'styled-components', 'material ui', 'mui', 'bootstrap'],
|
||||
STATE_MANAGEMENT: [
|
||||
'redux',
|
||||
'rtk',
|
||||
'redux toolkit',
|
||||
'redux toolkit query',
|
||||
'effector',
|
||||
'react-query',
|
||||
'mobx',
|
||||
],
|
||||
DATABASES: ['mysql', 'postgres', 'mongodb', 'redis', 'cassandra', 'sqlite', 'firebase'],
|
||||
DEVOPS: ['docker', 'kubernetes', 'jenkins', 'ansible', 'terraform'],
|
||||
TESTING: ['jest', 'mocha', 'cypress', 'selenium', 'playwright', 'jasmine', 'puppeteer', 'vitest'],
|
||||
MOBILE: ['react native', 'flutter', 'swift', 'kotlin', 'xamarin', 'objective-c'],
|
||||
TOOLS: ['webpack', 'vite', 'graphql', 'rest', 'storybook'],
|
||||
} as const
|
||||
|
||||
export const ALL_KEYWORDS = [...new Set(Object.values(KEYWORDS).flat().sort())]
|
||||
|
||||
export type Keyword = (typeof ALL_KEYWORDS)[number]
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Vacancies, VacancyData } from '~/services/vacancies/vacancies.types'
|
||||
import { KeywordsResponse, Vacancies, VacancyData } from '~/services/vacancies/vacancies.types'
|
||||
|
||||
export class VacanciesService {
|
||||
baseUrl = 'https://vacancies-trends-api.andrii.es'
|
||||
baseUrl = process.env.VACANCIES_API_URL ?? 'https://vacancies-trends-api.andrii.es'
|
||||
|
||||
async getAll(): Promise<Vacancies> {
|
||||
return await fetch(`${this.baseUrl}/vacancies`).then(res => res.json())
|
||||
@@ -13,13 +13,21 @@ export class VacanciesService {
|
||||
.then(this.formatDateOnData)
|
||||
}
|
||||
|
||||
formatDateOnData(data: VacancyData): VacancyData {
|
||||
return data.map(item => {
|
||||
async getKeywords(): Promise<KeywordsResponse> {
|
||||
return await fetch(`${this.baseUrl}/vacancies/keywords`).then(res => res.json())
|
||||
}
|
||||
|
||||
private formatDateOnData(data: VacancyData): VacancyData {
|
||||
const mapped = data.data.map(item => {
|
||||
return {
|
||||
...item,
|
||||
date: new Date(item.date).toLocaleDateString('ru'),
|
||||
}
|
||||
})
|
||||
return {
|
||||
...data,
|
||||
data: mapped,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,4 +8,13 @@ export interface VacancyDataEntry {
|
||||
vacancies: number
|
||||
}
|
||||
|
||||
export type VacancyData = Array<{ date: string; [key: string]: string | number }>
|
||||
export type VacancyData = {
|
||||
categories: string[]
|
||||
data: Array<{ date: string; [key: string]: string | number }>
|
||||
}
|
||||
|
||||
export type KeywordsResponse = {
|
||||
allKeywords: string[]
|
||||
keywords: Record<string, string[]>
|
||||
presets: Record<string, string[]>
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user