1// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
2// See the LICENCE file in the repository root for full licence text.
3
4import GroupJson from 'interfaces/group-json';
5import { forEach } from 'lodash';
6import { present } from './string';
7
8export type Modifiers = (string | null | undefined)[] | Partial<Record<string, boolean | null | undefined>> | string | null | undefined;
9
10const eachModifier = (modifiersArray: Modifiers[], callback: (modifier: string) => void) => {
11 modifiersArray.forEach((modifiers) => {
12 if (Array.isArray(modifiers)) {
13 modifiers.forEach((modifier) => {
14 if (modifier != null) {
15 callback(modifier);
16 }
17 });
18 } else if (typeof modifiers === 'string') {
19 callback(modifiers);
20 } else {
21 forEach(modifiers, (isActive, modifier) => {
22 if (isActive) {
23 callback(modifier);
24 }
25 });
26 }
27 });
28};
29
30export function classWithModifiers(className: string, ...modifiersArray: Modifiers[]) {
31 let ret = className;
32
33 eachModifier(modifiersArray, (m) => ret += ` ${className}--${m}`);
34
35 return ret;
36}
37
38export function groupColour(group?: GroupJson | null) {
39 return { '--group-colour': group?.colour ?? 'initial' };
40}
41
42export function mergeModifiers(...modifiersArray: Modifiers[]) {
43 const ret: string[] = [];
44
45 eachModifier(modifiersArray, (m) => ret.push(m));
46
47 return ret;
48}
49
50export function urlPresence(url?: string | null) {
51 // Wrapping the string with quotes and escaping the used quotes inside
52 // is sufficient. Use double quote as it's easy to figure out with
53 // encodeURI (it doesn't escape single quote).
54 return present(url) ? `url("${String(url).replace(/"/g, '%22')}")` : undefined;
55}
56