|
1 | 1 | import { faGithub, faLinkedin, faInstagram, faFacebook } from '@fortawesome/free-brands-svg-icons'; |
2 | 2 | import { faGlobe, faEnvelope } from '@fortawesome/free-solid-svg-icons'; |
3 | | -import { envHelper } from '@/shared/const/envHelper'; |
4 | | -import { Member, Department } from '../model/types/types'; |
| 3 | +import { Member, Team } from '@/entities/Member/model/types/types'; |
| 4 | +import { getDepartmentTranslation, getTeamTranslation, getLanguageCode } from './translations'; |
5 | 5 |
|
6 | 6 | /** |
7 | | - * LinksMap provides a mapping of link types to FontAwesome icons. |
| 7 | + * Provides a set of icon links for various platforms. |
| 8 | + * |
| 9 | + * @returns {object} An object containing font-awesome icons for different links. |
8 | 10 | */ |
9 | | -export const getLinks = () => ({ |
10 | | - website: faGlobe, |
11 | | - github: faGithub, |
12 | | - linkedin: faLinkedin, |
13 | | - facebook: faFacebook, |
14 | | - instagram: faInstagram, |
15 | | - email: faEnvelope, |
16 | | -}); |
| 11 | +export const getLinks = () => { |
| 12 | + return { |
| 13 | + website: faGlobe, |
| 14 | + github: faGithub, |
| 15 | + linkedin: faLinkedin, |
| 16 | + facebook: faFacebook, |
| 17 | + instagram: faInstagram, |
| 18 | + email: faEnvelope, |
| 19 | + }; |
| 20 | +}; |
17 | 21 |
|
18 | 22 | /** |
19 | | - * Maps raw member data from the API response to the Member type used in the application. |
20 | | - * Sorts members alphabetically by name. |
21 | | - * @param membersData An array of raw member data from the API. |
22 | | - * @returns An array of members mapped to the Member type. |
| 23 | + * Represents the organized data structure containing teams and departments. |
| 24 | + * |
| 25 | + * @typedef {Object} OrganizedData |
| 26 | + * @property {Map<number, Team>} teamsMap - A map associating team IDs with team objects, |
| 27 | + * organized according to their translation and language preference. |
23 | 28 | */ |
24 | | -export const getMembers = (membersData: any[]): Member[] => { |
25 | | - return ( |
26 | | - membersData |
27 | | - .map((member: any) => { |
28 | | - const logoUrl = member.attributes.Logo?.data?.attributes?.url |
29 | | - ? `${envHelper.strapiHost}${member.attributes.Logo.data.attributes.url}` |
30 | | - : null; |
31 | | - |
32 | | - return { |
33 | | - id: member.id, |
34 | | - name: member.attributes.Name, |
35 | | - task: member.attributes.Task, |
36 | | - email: member.attributes.Email, |
37 | | - linkedin: member.attributes.Linkedin, |
38 | | - website: member.attributes.Website, |
39 | | - github: member.attributes.Github, |
40 | | - logo: logoUrl, |
41 | | - facebook: member.attributes.Facebook, |
42 | | - instagram: member.attributes.Instagram, |
43 | | - createdAt: member.attributes.createdAt, |
44 | | - updatedAt: member.attributes.updatedAt, |
45 | | - locale: member.attributes.locale, |
46 | | - }; |
47 | | - }) |
48 | | - .sort((a, b) => a.name.localeCompare(b.name)) || [] |
49 | | - ); |
50 | | -}; |
51 | 29 |
|
52 | 30 | /** |
53 | | - * Maps raw department data from the API response to the Department type used in the application. |
54 | | - * Sorts departments based on a predefined order depending on the locale. |
55 | | - * @param departmentsData An array of raw department data from the API. |
56 | | - * @param locale The language locale used to find the localized department name. |
57 | | - * @returns An array of departments mapped to the Department type. |
| 31 | + * Organizes members into teams and departments based on their properties, |
| 32 | + * and sorts both the members alphabetically within their teams and departments, |
| 33 | + * as well as the teams based on a predefined order dictated by language. |
| 34 | + * |
| 35 | + * @param {Member[]} members - An array of member objects, each containing associated team and department data. |
| 36 | + * @param {string} lng - The language code used to determine which language to use for translations and sorting. |
| 37 | + * @returns {OrganizedData} The organized data containing teams mapped by their IDs. |
58 | 38 | */ |
59 | | -export const getDepartments = (departmentsData: any[], locale: string): Department[] => { |
60 | | - const orderEn = [ |
61 | | - 'Lead Developers', |
62 | | - 'Game Developer', |
63 | | - 'Website Developer', |
64 | | - 'Developers', |
| 39 | +export const organizeMembers = (members: Member[], lng: string) => { |
| 40 | + const teamsMap = new Map<number, Team>(); |
| 41 | + const fullLanguageCode = getLanguageCode(lng); |
| 42 | + |
| 43 | + const enOrder = [ |
| 44 | + 'Game Design', |
| 45 | + 'Mentoring', |
| 46 | + 'Development', |
65 | 47 | 'Graphics', |
66 | | - 'Graphical Game Development', |
67 | | - 'Sound Design & Composition', |
68 | | - 'Sound Design-Oriented Game Development', |
| 48 | + 'Sounds', |
| 49 | + 'Comic Book', |
| 50 | + 'Production', |
| 51 | + 'Analysis', |
| 52 | + 'Game Art Education Package', |
| 53 | + 'Other Participants', |
| 54 | + 'Special Thanks', |
69 | 55 | ]; |
70 | 56 |
|
71 | | - const orderFi = [ |
72 | | - 'Vastaava Ohjelmistokehittäjä', |
73 | | - 'Pelikehittäjä', |
74 | | - 'Verkkosivukehittäjä', |
75 | | - 'Ohjelmistokehittäjät', |
| 57 | + const fiOrder = [ |
| 58 | + 'Pelisuunnittelu', |
| 59 | + 'Mentorointi', |
| 60 | + 'Ohjelmistokehitys', |
76 | 61 | 'Grafiikka', |
77 | | - 'Graafinen pelikehitys', |
78 | | - 'Äänisuunnittelu ja Sävellys', |
79 | | - 'Äänisuunnittelullinen Pelikehitys', |
| 62 | + 'Äänet', |
| 63 | + 'Sarjakuva', |
| 64 | + 'Tuotanto', |
| 65 | + 'Analyysi', |
| 66 | + 'Pelitaiteen Opetuspaketti', |
| 67 | + 'Muut Mukana Olleet', |
| 68 | + 'Erityiskiitokset', |
80 | 69 | ]; |
81 | 70 |
|
82 | | - const order = locale === 'fi' ? orderFi : orderEn; |
| 71 | + const order = lng === 'fi' ? fiOrder : enOrder; |
| 72 | + |
| 73 | + members.forEach((member: Member) => { |
| 74 | + const memberTeam = member.team; |
| 75 | + const memberDepartment = member.department; |
| 76 | + |
| 77 | + if (memberTeam) { |
| 78 | + let team = teamsMap.get(memberTeam.id); |
| 79 | + if (!team) { |
| 80 | + const teamName = getTeamTranslation( |
| 81 | + memberTeam.translations || [], |
| 82 | + fullLanguageCode, |
| 83 | + ); |
| 84 | + |
| 85 | + team = { ...memberTeam, name: teamName, members: [], departments: [] }; |
| 86 | + teamsMap.set(memberTeam.id, team); |
| 87 | + } |
83 | 88 |
|
84 | | - return ( |
85 | | - departmentsData |
86 | | - .map((dept: any) => { |
87 | | - const localizedDept = dept.attributes.localizations?.data.find( |
88 | | - (loc: any) => loc.attributes.locale === locale, |
| 89 | + if (memberDepartment) { |
| 90 | + let department = team.departments.find( |
| 91 | + (departmentItem) => departmentItem.id === memberDepartment.id, |
89 | 92 | ); |
| 93 | + if (!department) { |
| 94 | + const departmentName = getDepartmentTranslation( |
| 95 | + memberDepartment.translations || [], |
| 96 | + fullLanguageCode, |
| 97 | + ); |
90 | 98 |
|
91 | | - const localizedDeptName = localizedDept |
92 | | - ? localizedDept.attributes.Name |
93 | | - : dept.attributes.Name; |
| 99 | + department = { ...memberDepartment, name: departmentName, members: [] }; |
| 100 | + team.departments.push(department); |
| 101 | + } |
94 | 102 |
|
95 | | - const members = getMembers(dept.attributes.members?.data || []); |
| 103 | + department.members.push(member); |
| 104 | + } else { |
| 105 | + team.members.push(member); |
| 106 | + } |
| 107 | + } |
| 108 | + }); |
| 109 | + teamsMap.forEach((team) => { |
| 110 | + team.members.sort((a, b) => a.name.localeCompare(b.name)); |
| 111 | + team.departments.forEach((department) => { |
| 112 | + department.members.sort((a, b) => a.name.localeCompare(b.name)); |
| 113 | + }); |
| 114 | + }); |
| 115 | + const sortedTeams = Array.from(teamsMap.values()).sort((a, b) => { |
| 116 | + const indexA = order.indexOf(a.name); |
| 117 | + const indexB = order.indexOf(b.name); |
| 118 | + return indexA - indexB; |
| 119 | + }); |
96 | 120 |
|
97 | | - return { |
98 | | - id: dept.id, |
99 | | - name: localizedDeptName, |
100 | | - members, |
101 | | - }; |
102 | | - }) |
103 | | - .sort((a, b) => order.indexOf(a.name) - order.indexOf(b.name)) || [] |
104 | | - ); |
| 121 | + return { teamsMap: new Map(sortedTeams.map((team) => [team.id, team])) }; |
105 | 122 | }; |
0 commit comments