<!--
  - Licensed to the Apache Software Foundation (ASF) under one or more
  - contributor license agreements.  See the NOTICE file distributed with
  - this work for additional information regarding copyright ownership.
  - The ASF licenses this file to You under the Apache License, Version 2.0
  - (the "License"); you may not use this file except in compliance with
  - the License.  You may obtain a copy of the License at
  -
  -     http://www.apache.org/licenses/LICENSE-2.0
  -
  - Unless required by applicable law or agreed to in writing, software
  - distributed under the License is distributed on an "AS IS" BASIS,
  - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  - See the License for the specific language governing permissions and
  - limitations under the License.
  -->

<template>
  <div id="app">
    <s-container v-if="localStorage.getItem('Access-Token')">
      <el-breadcrumb separator="/" class="bread-wrap">
        <el-breadcrumb-item :to="{ path: '/' }">{{
          $t('common.home')
        }}</el-breadcrumb-item>
        <el-breadcrumb-item v-for="each in menus" :key="each">
          {{ each }}
        </el-breadcrumb-item>
      </el-breadcrumb>
      <router-view />
    </s-container>
    <template v-else>
      <router-view />
    </template>
  </div>
</template>

<script>
import SContainer from '@/components/Container/index.vue'
export default {
  name: 'App',
  components: {
    SContainer
  },
  data() {
    return {
      menus: [],
      localStorage: window.localStorage
    }
  },
  watch: {
    $route(to, from) {
      for (const parentMenuItem of this.$t('common').menuData) {
        if (!parentMenuItem.child) {
          if (parentMenuItem.href === to.path) {
            this.menus = [parentMenuItem.title]
            break
          } else {
            continue
          }
        }
        for (const childMenuItem of parentMenuItem.child) {
          if (childMenuItem.href === to.path) {
            this.menus = [parentMenuItem.title, childMenuItem.title]
            break
          }
        }
      }
    }
  }
}
</script>
<style lang="scss" scoped>
.bread-wrap {
  margin-bottom: 15px;
}
</style>
