kazama-emoji-component
Version:
Emoji Picker component modified by Kazama DeFi
176 lines (157 loc) • 4.07 kB
text/typescript
import { Categories, SuggestionMode } from '../types/exposedTypes';
export { Categories };
const categoriesOrdered: Categories[] = [
Categories.SUGGESTED,
Categories.CUSTOM,
Categories.DEFAULT,
Categories.PEPE,
Categories.KEK,
Categories.FAMILY_GUY,
Categories.WOJAK,
Categories.CURRENCIES,
Categories.TEXT,
Categories.OTHER,
Categories.SMILEYS_PEOPLE,
Categories.ANIMALS_NATURE,
Categories.FOOD_DRINK,
Categories.TRAVEL_PLACES,
Categories.ACTIVITIES,
Categories.OBJECTS,
Categories.SYMBOLS,
Categories.FLAGS
];
export const SuggestedRecent: CategoryConfig = {
name: 'Recently Used',
category: Categories.SUGGESTED
};
export type CustomCategoryConfig = {
category: Categories.CUSTOM;
name: string;
};
const configByCategory: Record<Categories, CategoryConfig> = {
[]: {
category: Categories.SUGGESTED,
name: 'Frequently Used'
},
[]: {
category: Categories.CUSTOM,
name: 'Custom Emojis'
},
[]: {
category: Categories.DEFAULT,
name: 'Default'
},
[]: {
category: Categories.PEPE,
name: 'Pepe'
},
[]: {
category: Categories.KEK,
name: 'Keks'
},
[]: {
category: Categories.FAMILY_GUY,
name: 'Family Guy'
},
[]: {
category: Categories.WOJAK,
name: 'Wojak'
},
[]: {
category: Categories.TEXT,
name: 'Text'
},
[]: {
category: Categories.CURRENCIES,
name: 'Currencies'
},
[]: {
category: Categories.SMILEYS_PEOPLE,
name: 'Smileys & People'
},
[]: {
category: Categories.ANIMALS_NATURE,
name: 'Animals & Nature'
},
[]: {
category: Categories.FOOD_DRINK,
name: 'Food & Drink'
},
[]: {
category: Categories.TRAVEL_PLACES,
name: 'Travel & Places'
},
[]: {
category: Categories.ACTIVITIES,
name: 'Activities'
},
[]: {
category: Categories.OBJECTS,
name: 'Objects'
},
[]: {
category: Categories.SYMBOLS,
name: 'Symbols'
},
[]: {
category: Categories.FLAGS,
name: 'Flags'
},
[]: {
category: Categories.OTHER,
name: 'Other'
}
};
export function baseCategoriesConfig(
modifiers?: Record<Categories, CategoryConfig>
): CategoriesConfig {
return categoriesOrdered.map(category => {
return {
...configByCategory[category],
...(modifiers && modifiers[category] && modifiers[category])
};
});
}
export function categoryFromCategoryConfig(category: CategoryConfig) {
return category.category;
}
export function categoryNameFromCategoryConfig(category: CategoryConfig) {
return category.name;
}
export type CategoriesConfig = CategoryConfig[];
export type CategoryConfig = {
category: Categories;
name: string;
};
export type UserCategoryConfig = Array<Categories | CategoryConfig>;
export function mergeCategoriesConfig(
userCategoriesConfig: UserCategoryConfig = [],
modifiers: CategoryConfigModifiers = {}
): CategoriesConfig {
const extra = {} as Record<Categories, CategoryConfig>;
if (modifiers.suggestionMode === SuggestionMode.RECENT) {
extra[Categories.SUGGESTED] = SuggestedRecent;
}
const base = baseCategoriesConfig(extra);
if (!userCategoriesConfig?.length) {
return base;
}
return userCategoriesConfig.map(category => {
if (typeof category === 'string') {
return getBaseConfigByCategory(category, extra[category]);
}
return {
...getBaseConfigByCategory(category.category, extra[category.category]),
...category
};
});
}
function getBaseConfigByCategory(
category: Categories,
modifier: CategoryConfig = {} as CategoryConfig
) {
return Object.assign(configByCategory[category], modifier);
}
type CategoryConfigModifiers = {
suggestionMode?: SuggestionMode;
};