import { ListItem, Location, PhotoFilters } from '@reactive-resume/schema'; import clsx from 'clsx'; import get from 'lodash/get'; import isArray from 'lodash/isArray'; import isEmpty from 'lodash/isEmpty'; export type Required = T & { [P in K]-?: T[P] }; export type PageProps = { page: number; }; export const formatLocation = (location?: Location): string => { if (!location) return ''; const locationArr = [location.address, location.city, location.region, location.postalCode, location.country]; const filteredLocationArr = locationArr.filter((x) => !isEmpty(x)); return filteredLocationArr.join(', '); }; export const addHttp = (url: string) => { if (url.search(/^http[s]?:\/\//) == -1) { url = 'http://' + url; } return url; }; export const isValidUrl = (string: string): boolean => { let url: URL; try { url = new URL(string); } catch (_) { return false; } return url.protocol === 'http:' || url.protocol === 'https:'; }; type Separator = ', ' | ' / ' | ' | '; export const parseListItemPath = (item: ListItem, path: string | string[], separator: Separator = ', '): string => { if (isArray(path)) { const value = path.map((_path) => get(item, _path)).filter((x) => x); return value.join(separator); } else { const value = get(item, path); return value; } }; export const getPhotoClassNames = (filters: PhotoFilters) => clsx({ 'object-cover': true, grayscale: filters.grayscale, '!border-[4px] !border-solid': filters.border, 'rounded-lg': filters.shape === 'rounded-square', 'rounded-full': filters.shape === 'circle', });