blocks/community/kug-map/kug-map.tsx (51 lines of code) (raw):
import React, { FC, useCallback, useMemo, useState } from 'react';
import GoogleMapReact from 'google-map-react';
import { KugMapMarker } from './kug-map-marker';
import styles from './kug-map.module.css';
import { settings } from '../../../static/js/util/map-settings';
interface KugMap {
userGroupData: UserGroupsData;
}
export interface UserGroupEntity extends UserGroup {
id: string;
}
export const KugMap: FC<KugMap> = ({ userGroupData }) => {
const [activeId, setActiveId] = useState('');
const userGroups: UserGroupEntity[] = useMemo(() => {
const groups: UserGroupEntity[] = [];
userGroupData.forEach((region) =>
region.groups.map((group: UserGroup) => {
if (!!group?.position) {
groups.push({
...group,
id: `${group.name}-${group.country}-${group.url}`,
});
}
})
);
return groups;
}, [userGroupData]);
const handleChildClick = useCallback((key: string) => {
setActiveId(key);
}, []);
return (
<div className={styles.map}>
<GoogleMapReact
bootstrapURLKeys={{ key: settings.key }}
defaultCenter={settings.defaultCenter}
defaultZoom={settings.defaultZoom}
options={settings.options}
onChildClick={handleChildClick}
>
{userGroups.map((group) => (
<KugMapMarker
key={group.id}
lat={group.position.lat}
lng={group.position.lng}
group={group}
showTooltip={group.id === activeId}
onClose={handleChildClick}
/>
))}
</GoogleMapReact>
</div>
);
};