@@ -9,6 +9,7 @@ import type {PopupEvent} from '../types/events';
99
1010import { MapContext } from './map' ;
1111import { deepEqual } from '../utils/deep-equal' ;
12+ import { compareClassNames } from '../utils/compare-class-names' ;
1213
1314export type PopupProps = PopupOptions & {
1415 /** Longitude of the anchor location */
@@ -24,11 +25,6 @@ export type PopupProps = PopupOptions & {
2425 children ?: React . ReactNode ;
2526} ;
2627
27- // Adapted from https://github.com/mapbox/mapbox-gl-js/blob/v1.13.0/src/ui/popup.js
28- function getClassList ( className : string ) {
29- return new Set ( className ? className . trim ( ) . split ( / \s + / ) : [ ] ) ;
30- }
31-
3228/* eslint-disable complexity,max-statements */
3329export const Popup = memo (
3430 forwardRef ( ( props : PopupProps , ref : React . Ref < PopupInstance > ) => {
@@ -37,7 +33,6 @@ export const Popup = memo(
3733 return document . createElement ( 'div' ) ;
3834 } , [ ] ) ;
3935 const thisRef = useRef ( { props} ) ;
40- thisRef . current . props = props ;
4136
4237 const popup : PopupInstance = useMemo ( ( ) => {
4338 const options = { ...props } ;
@@ -75,32 +70,24 @@ export const Popup = memo(
7570 useImperativeHandle ( ref , ( ) => popup , [ ] ) ;
7671
7772 if ( popup . isOpen ( ) ) {
73+ const oldProps = thisRef . current . props ;
7874 if ( popup . getLngLat ( ) . lng !== props . longitude || popup . getLngLat ( ) . lat !== props . latitude ) {
7975 popup . setLngLat ( [ props . longitude , props . latitude ] ) ;
8076 }
81- if ( props . offset && ! deepEqual ( popup . options . offset , props . offset ) ) {
77+ if ( props . offset && ! deepEqual ( oldProps . offset , props . offset ) ) {
78+ popup . options . anchor = props . anchor ;
8279 popup . setOffset ( props . offset ) ;
8380 }
84- if ( popup . options . anchor !== props . anchor || popup . options . maxWidth !== props . maxWidth ) {
85- popup . options . anchor = props . anchor ;
81+ if ( oldProps . anchor !== props . anchor || oldProps . maxWidth !== props . maxWidth ) {
8682 popup . setMaxWidth ( props . maxWidth ) ;
8783 }
88- if ( popup . options . className !== props . className ) {
89- const prevClassList = getClassList ( popup . options . className ) ;
90- const nextClassList = getClassList ( props . className ) ;
91-
92- for ( const c of prevClassList ) {
93- if ( ! nextClassList . has ( c ) ) {
94- popup . removeClassName ( c ) ;
95- }
96- }
97- for ( const c of nextClassList ) {
98- if ( ! prevClassList . has ( c ) ) {
99- popup . addClassName ( c ) ;
100- }
84+ const classNameDiff = compareClassNames ( oldProps . className , props . className ) ;
85+ if ( classNameDiff ) {
86+ for ( const c of classNameDiff ) {
87+ popup . toggleClassName ( c ) ;
10188 }
102- popup . options . className = props . className ;
10389 }
90+ thisRef . current . props = props ;
10491 }
10592
10693 return createPortal ( props . children , container ) ;
0 commit comments