<commit_before>(function () {
    'use strict';

    angular
        .module('atlas')
        .factory('straatbeeldReducers', straatbeeldReducersFactory);

    straatbeeldReducersFactory.$inject = ['ACTIONS', 'STRAATBEELD_CONFIG'];

    function straatbeeldReducersFactory (ACTIONS, STRAATBEELD_CONFIG) {
        var reducers = {};

        reducers[ACTIONS.FETCH_STRAATBEELD_BY_ID.id] = fetchStraatbeeldByIdReducer;
        reducers[ACTIONS.FETCH_STRAATBEELD_BY_HOTSPOT.id] = fetchStraatbeeldByIdReducer;
        reducers[ACTIONS.FETCH_STRAATBEELD_BY_LOCATION.id] = fetchStraatbeeldByLocationReducer;
        reducers[ACTIONS.SET_STRAATBEELD_HISTORY.id] = setStraatbeeldHistoryReducer;
        reducers[ACTIONS.STRAATBEELD_FULLSCREEN.id] = straatbeeldFullscreenReducer;
        reducers[ACTIONS.SHOW_STRAATBEELD_INITIAL.id] = showStraatbeeldReducer;
        reducers[ACTIONS.SHOW_STRAATBEELD_SUBSEQUENT.id] = showStraatbeeldSubsequentReducer;
        reducers[ACTIONS.SET_STRAATBEELD_ORIENTATION.id] = setOrientationReducer;

        return reducers;

        /**
         * @description If the oldState had an active straatbeeld it will remember the heading.
         *
         * @param {Object} oldState
         * @param {Object} payload - {id: 'abc123', heading: 90}
         *
         * @returns {Object} newState
         */
        function fetchStraatbeeldByIdReducer (oldState, payload) {
            const newState = angular.copy(oldState);

            newState.straatbeeld = newState.straatbeeld || {};
            initializeStraatbeeld(newState.straatbeeld);

            newState.straatbeeld.id = payload.id;
            newState.straatbeeld.heading = payload.heading ||
                (oldState.straatbeeld && oldState.straatbeeld.heading) ||
                0;
            newState.straatbeeld.isInitial = payload.isInitial;

            if (angular.isDefined(payload.isFullscreen)) {
                newState.straatbeeld.isFullscreen = payload.isFullscreen;
            }

            newState.map.highlight = null;

            newState.search = null;

            newState.dataSelection = null;

            newState.map.isLoading = true;

            return newState;
        }

        /**
         * @param {Object} oldState
         * @param {Array} payload - A location, e.g. [52.123, 4.789]
         *
         * @returns {Object} newState
         */
        function fetchStraatbeeldByLocationReducer (oldState, payload) {
            var newState = angular.copy(oldState);

            newState.straatbeeld = newState.straatbeeld || {};
            initializeStraatbeeld(newState.straatbeeld);

            newState.straatbeeld.location = payload;
            newState.straatbeeld.targetLocation = payload;

            if ((oldState.layerSelection && oldState.layerSelection.isEnabled) ||
                (oldState.map && oldState.map.isFullscreen)) {
                newState.map.viewCenter = payload;
            }

            if (newState.layerSelection) {
                newState.layerSelection.isEnabled = false;
            }
            if (newState.map) {
                newState.map.showActiveOverlays = false;
                newState.map.isFullscreen = false;
                newState.map.geometry = [];
            }
            newState.search = null;
            if (newState.page) {
                newState.page.name = null;
            }
            // If a straatbeeld is loaded by it's location
            // then clear any active detail
            newState.detail = null;
            newState.dataSelection = null;

            return newState;
        }

        function initializeStraatbeeld (straatbeeld) {
            // Resets straatbeeld properties
            // Leave any other properties of straatbeeld untouched
            straatbeeld.id = null;
            straatbeeld.location = null;

            straatbeeld.isInitial = true;

            straatbeeld.date = null;
            straatbeeld.hotspots = [];

            straatbeeld.heading = null;
            straatbeeld.pitch = null;
            straatbeeld.fov = null;

            straatbeeld.image = null;

            straatbeeld.isLoading = true;
        }

        function straatbeeldFullscreenReducer (oldState, payload) {
            var newState = angular.copy(oldState);

            if (angular.isDefined(payload)) {
                newState.straatbeeld.isFullscreen = payload;
            }

            return newState;
        }

        /**
         * @param {Object} oldState
         * @param {Object} payload -  data from straatbeeld-api
         *
         * @returns {Object} newState
         */
        function showStraatbeeldReducer (oldState, payload) {
            var newState = angular.copy(oldState);

            // Straatbeeld can be null if another action gets triggered between FETCH_STRAATBEELD and SHOW_STRAATBEELD
            if (angular.isObject(newState.straatbeeld)) {
                newState.straatbeeld.id = payload.id || newState.straatbeeld.id;
                newState.straatbeeld.date = payload.date;

                newState.straatbeeld.pitch = oldState.straatbeeld.pitch || 0;
                newState.straatbeeld.fov = oldState.straatbeeld.fov || STRAATBEELD_CONFIG.DEFAULT_FOV;

                if (angular.isArray(newState.straatbeeld.location)) {
                    // straatbeeld is loaded by location
                    if (angular.isArray(newState.straatbeeld.targetLocation)) {
                        // Point at the target location
                        newState.straatbeeld.heading = getHeadingDegrees(
                            payload.location,
                            newState.straatbeeld.targetLocation
                        );
                    }
                } else {
                    // straatbeeld is loaded by id, center map on location
                    newState.map.viewCenter = payload.location;
                }

                newState.straatbeeld.hotspots = payload.hotspots;
                newState.straatbeeld.isLoading = false;
                newState.straatbeeld.location = payload.location;
                newState.straatbeeld.image = payload.image;
                newState.map.isLoading = false;
            }

            return newState;
        }

        /**
         * @param {Object} oldState
         * @param {Object} payload -  data from straatbeeld-api
         *
         * @returns {Object} newState
         */
        function showStraatbeeldSubsequentReducer (oldState, payload) {
            const state = showStraatbeeldReducer(oldState, payload),
                map = state.map ? {...state.map} : {};

            if (angular.isObject(state.straatbeeld)) {
                // Keep map centered on last selected hotspot
                map.viewCenter = payload.location;
            }
<commit_msg>refactored angular copy in straatbeeld reducer part two tg-4293<commit_after>(function () {
    'use strict';

    angular
        .module('atlas')
        .factory('straatbeeldReducers', straatbeeldReducersFactory);

    straatbeeldReducersFactory.$inject = ['ACTIONS', 'STRAATBEELD_CONFIG'];

    function straatbeeldReducersFactory (ACTIONS, STRAATBEELD_CONFIG) {
        var reducers = {};

        reducers[ACTIONS.FETCH_STRAATBEELD_BY_ID.id] = fetchStraatbeeldByIdReducer;
        reducers[ACTIONS.FETCH_STRAATBEELD_BY_HOTSPOT.id] = fetchStraatbeeldByIdReducer;
        reducers[ACTIONS.FETCH_STRAATBEELD_BY_LOCATION.id] = fetchStraatbeeldByLocationReducer;
        reducers[ACTIONS.SET_STRAATBEELD_HISTORY.id] = setStraatbeeldHistoryReducer;
        reducers[ACTIONS.STRAATBEELD_FULLSCREEN.id] = straatbeeldFullscreenReducer;
        reducers[ACTIONS.SHOW_STRAATBEELD_INITIAL.id] = showStraatbeeldReducer;
        reducers[ACTIONS.SHOW_STRAATBEELD_SUBSEQUENT.id] = showStraatbeeldSubsequentReducer;
        reducers[ACTIONS.SET_STRAATBEELD_ORIENTATION.id] = setOrientationReducer;

        return reducers;

        /**
         * @description If the oldState had an active straatbeeld it will remember the heading.
         *
         * @param {Object} state
         * @param {Object} payload - {id: 'abc123', heading: 90}
         *
         * @returns {Object} newState
         */
        function fetchStraatbeeldByIdReducer (state, payload) {
            const straatbeeld = initializeStraatbeeld(state.straatbeeld || {});

            if (angular.isDefined(payload.isFullscreen)) {
                straatbeeld.isFullscreen = payload.isFullscreen;
            }

            return {
                ...state,
                straatbeeld: {
                    ...straatbeeld,
                    id: payload.id,
                    heading: payload.heading || state.straatbeeld.heading || 0,
                    isInitial: payload.isInitial
                },
                map: {
                    ...state.map,
                    highlight: false,
                    isLoading: true
                },
                search: null,
                dataSelection: null
            };
        }

        /**
         * @param {Object} state
         * @param {Array} payload - A location, e.g. [52.123, 4.789]
         *
         * @returns {Object} newState
         */
        function fetchStraatbeeldByLocationReducer (state, payload) {
            const straatbeeld = initializeStraatbeeld(state.straatbeeld || {}),
                map = state.map ? {...state.map} : state.map;

            if ((state.layerSelection && state.layerSelection.isEnabled) ||
                (map && map.isFullscreen)) {
                map.viewCenter = payload;
            }

            return {
                ...state,
                straatbeeld: {
                    ...straatbeeld,
                    location: payload,
                    targetLocation: payload
                },
                map: {
                    ...map,
                    showActiveOverlays: false,
                    isFullscreen: false,
                    geometry: []
                },
                layerSelection: {
                    ...state.layerSelection,
                    isEnabled: false
                },
                page: {
                    ...state.page,
                    name: null
                },
                search: null,
                dataSelection: null,
                detail: null
            };
        }

        function initializeStraatbeeld (straatbeeld) {
            // Resets straatbeeld properties
            // Leave any other properties of straatbeeld untouched
            return {
                ...straatbeeld,
                id: null,
                location: null,
                isInitial: true,
                date: null,
                hotspots: [],
                heading: null,
                pitch: null,
                fov: null,
                image: null,
                isLoading: true
            };
        }

        function straatbeeldFullscreenReducer (oldState, payload) {
            var newState = angular.copy(oldState);

            if (angular.isDefined(payload)) {
                newState.straatbeeld.isFullscreen = payload;
            }

            return newState;
        }

        /**
         * @param {Object} state
         * @param {Object} payload -  data from straatbeeld-api
         *
         * @returns {Object} newState
         */
        function showStraatbeeldReducer (state, payload) {
            const straatbeeld = state.straatbeeld ? {...state.straatbeeld} : state.straatbeeld,
                map = state.map ? {...state.map} : state.map;

            // Straatbeeld can be null if another action gets triggered between FETCH_STRAATBEELD and SHOW_STRAATBEELD
            if (angular.isObject(straatbeeld)) {
                straatbeeld.id = payload.id || state.straatbeeld.id;
                straatbeeld.date = payload.date;

                straatbeeld.pitch = state.straatbeeld.pitch || 0;
                straatbeeld.fov = state.straatbeeld.fov || STRAATBEELD_CONFIG.DEFAULT_FOV;

                if (angular.isArray(straatbeeld.location)) {
                    // straatbeeld is loaded by location
                    if (angular.isArray(straatbeeld.targetLocation)) {
                        // Point at the target location
                        straatbeeld.heading = getHeadingDegrees(
                            payload.location,
                            straatbeeld.targetLocation
                        );
                    }
                } else {
                    // straatbeeld is loaded by id, center map on location
                    map.viewCenter = payload.location;
                }

                straatbeeld.hotspots = payload.hotspots;
                straatbeeld.isLoading = false;
                straatbeeld.location = payload.location;
                straatbeeld.image = payload.image;
                map.isLoading = false;
            }

            // return newState;
            return {
                ...state,
                straatbeeld: {
                    ...straatbeeld
                },
                map: {
                    ...map
                }
            };
        }

        /**
         * @param {Object} oldState
         * @param {Object} payload -  data from straatbeeld-api
         *
         * @returns {Object} newState
         */
        function showStraatbeeldSubsequentReducer (oldState, payload) {
            const state = showStraatbeeldReducer(oldState, payload),
                map = state.map ? {...state.map} : state.map;

            if (angular.isObject(state.straatbeeld)) {
                // Keep map centered on last selected hotspot
                map.viewCenter = payload.location;
            }

{'fraction_non_alphanumeric': 0.08586151836260705, 'fraction_numerical': 0.00261286108288576, 'mean_word_length': 1.5347682119205297, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7250722', 'n_tokens_mistral': 3947, 'n_tokens_neox': 3643, 'n_words': 673}