247 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			247 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { createRouter, createWebHistory } from 'vue-router'
 | 
						|
import { mdiAccountBoxMultiple, mdiAccountGroupOutline, mdiAccountQuestion, mdiChartBox, mdiCodeTags, mdiCounter, mdiEarth, mdiHandCoin, mdiHome, mdiInformation, mdiWeb } from '@mdi/js'
 | 
						|
import About from '@/views/about/Index.vue'
 | 
						|
import AboutPage from '@/views/about/About.vue'
 | 
						|
import Acknowledgements from '@/views/about/Acknowledgements.vue'
 | 
						|
import Wanderhome from '@/views/about/Wanderhome.vue'
 | 
						|
import Home from '@/views/Home.vue'
 | 
						|
import Quiz from '@/views/quiz/Index.vue'
 | 
						|
import QuizPage from '@/views/quiz/Quiz.vue'
 | 
						|
import Question from '@/views/quiz/Question.vue'
 | 
						|
import NotFound from '@/views/errors/NotFound.vue'
 | 
						|
import Refused from '@/views/errors/Refused.vue'
 | 
						|
import Results from '@/views/results/Index.vue'
 | 
						|
import ResultsPage from '@/views/results/Results.vue'
 | 
						|
import Scores from '@/views/results/Scores.vue'
 | 
						|
import Answers from '@/views/results/Answers.vue'
 | 
						|
import Statistics from '@/views/results/Statistics.vue'
 | 
						|
 | 
						|
const routes = [
 | 
						|
    {
 | 
						|
        path: '/',
 | 
						|
        name: 'Home',
 | 
						|
        component: Home,
 | 
						|
        meta: {
 | 
						|
            index: 0,
 | 
						|
            svgPath: mdiHome,
 | 
						|
            title: 'Home'
 | 
						|
        }
 | 
						|
    },
 | 
						|
    {
 | 
						|
        path: '/quiz',
 | 
						|
        name: 'Quiz',
 | 
						|
        component: Quiz,
 | 
						|
        meta: {
 | 
						|
            index: 1,
 | 
						|
            svgPath: mdiAccountQuestion,
 | 
						|
            title: 'Take the Quiz'
 | 
						|
        },
 | 
						|
        children: [
 | 
						|
            {
 | 
						|
                path: '',
 | 
						|
                name: 'Quiz',
 | 
						|
                component: QuizPage,
 | 
						|
                meta: {
 | 
						|
                    index: 0,
 | 
						|
                    parentIndex: 1,
 | 
						|
                    title: 'Take the Quiz'
 | 
						|
                }
 | 
						|
            },
 | 
						|
            {
 | 
						|
                path: 'question/:id',
 | 
						|
                name: 'Question',
 | 
						|
                component: Question,
 | 
						|
                props: route => ({
 | 
						|
                    id: parseInt(route.params.id)
 | 
						|
                }),
 | 
						|
                meta: {
 | 
						|
                    index: 1,
 | 
						|
                    parentIndex: 1,
 | 
						|
                    title: 'Take the Quiz'
 | 
						|
                }
 | 
						|
            }
 | 
						|
        ]
 | 
						|
    },
 | 
						|
    {
 | 
						|
        path: '/about',
 | 
						|
        name: 'About',
 | 
						|
        component: About,
 | 
						|
        meta: {
 | 
						|
            index: 2,
 | 
						|
            svgPath: mdiInformation,
 | 
						|
            title: 'About'
 | 
						|
        },
 | 
						|
        children: [
 | 
						|
            {
 | 
						|
                path: '',
 | 
						|
                name: 'About',
 | 
						|
                component: AboutPage,
 | 
						|
                meta: {
 | 
						|
                    index: 0,
 | 
						|
                    parentIndex: 2,
 | 
						|
                    svgPath: mdiInformation,
 | 
						|
                    title: 'Background'
 | 
						|
                }
 | 
						|
            },
 | 
						|
            {
 | 
						|
                path: 'wanderhome',
 | 
						|
                name: 'Wanderhome',
 | 
						|
                component: Wanderhome,
 | 
						|
                meta: {
 | 
						|
                    index: 1,
 | 
						|
                    parentIndex: 2,
 | 
						|
                    svgPath: mdiHandCoin,
 | 
						|
                    title: 'About Wanderhome'
 | 
						|
                }
 | 
						|
            },
 | 
						|
            {
 | 
						|
                path: 'acknowledgements',
 | 
						|
                name: 'Acknowledgements',
 | 
						|
                component: Acknowledgements,
 | 
						|
                meta: {
 | 
						|
                    index: 2,
 | 
						|
                    parentIndex: 2,
 | 
						|
                    svgPath: mdiAccountGroupOutline,
 | 
						|
                    title: 'Acknowledgements'
 | 
						|
                }
 | 
						|
            },
 | 
						|
            {
 | 
						|
                path: 'https://git.vsnt.uk/viveksantayana/wanderhome-quiz',
 | 
						|
                name: 'SourceCode',
 | 
						|
                meta: {
 | 
						|
                    index: 3,
 | 
						|
                    parentIndex: 2,
 | 
						|
                    svgPath: mdiCodeTags,
 | 
						|
                    title: 'View Source Code'
 | 
						|
                }
 | 
						|
            }
 | 
						|
        ]
 | 
						|
    },
 | 
						|
    {
 | 
						|
        path: '/results',
 | 
						|
        name: 'Results',
 | 
						|
        component: Results,
 | 
						|
        meta: {
 | 
						|
            index: -1,
 | 
						|
            title: 'Results',
 | 
						|
            svgPath: mdiAccountBoxMultiple
 | 
						|
        },
 | 
						|
        children: [
 | 
						|
            {
 | 
						|
                path: '',
 | 
						|
                name: 'Result',
 | 
						|
                component: ResultsPage,
 | 
						|
                meta: {
 | 
						|
                    index: 0,
 | 
						|
                    title: 'Your Results',
 | 
						|
                    svgPath: mdiAccountBoxMultiple,
 | 
						|
                    parentIndex: -1
 | 
						|
                }
 | 
						|
            },
 | 
						|
            {
 | 
						|
                path: 'all',
 | 
						|
                name: 'Scores',
 | 
						|
                component: Scores,
 | 
						|
                meta: {
 | 
						|
                    index: 1,
 | 
						|
                    title: 'All Scores',
 | 
						|
                    svgPath: mdiCounter,
 | 
						|
                    parentIndex: -1
 | 
						|
                }
 | 
						|
            },
 | 
						|
            {
 | 
						|
                path: 'statistics',
 | 
						|
                name: 'Statistics',
 | 
						|
                component: Statistics,
 | 
						|
                meta: {
 | 
						|
                    index: 2,
 | 
						|
                    title: 'Statistics',
 | 
						|
                    svgPath: mdiChartBox,
 | 
						|
                    parentIndex: -1
 | 
						|
                }
 | 
						|
            },
 | 
						|
            {
 | 
						|
                path: 'answers',
 | 
						|
                name: 'Answers',
 | 
						|
                component: Answers,
 | 
						|
                meta: {
 | 
						|
                    index: 3,
 | 
						|
                    title: 'Global Answers',
 | 
						|
                    svgPath: mdiEarth,
 | 
						|
                    parentIndex: -1
 | 
						|
                }
 | 
						|
            }
 | 
						|
        ]
 | 
						|
    },
 | 
						|
    {
 | 
						|
        path: '/err_notfound',
 | 
						|
        name: 'NotFound',
 | 
						|
        component: NotFound,
 | 
						|
        meta: {
 | 
						|
            index: -1,
 | 
						|
            title: 'Error: Not Found',
 | 
						|
            svgPath: mdiWeb
 | 
						|
        }
 | 
						|
    },
 | 
						|
    {
 | 
						|
        path: "/:catchAll(.*)",
 | 
						|
        name: 'NotFound',
 | 
						|
        redirect: '/err_notfound',
 | 
						|
        meta: {
 | 
						|
            index: -1,
 | 
						|
            title: 'Error: Not Found',
 | 
						|
            svgPath: mdiWeb
 | 
						|
        }
 | 
						|
    },
 | 
						|
    {
 | 
						|
        path: "/err_refused",
 | 
						|
        name: 'Refused',
 | 
						|
        component: Refused,
 | 
						|
        meta: {
 | 
						|
            index: -1,
 | 
						|
            title: 'Error: Connection Refused',
 | 
						|
            svgPath: mdiWeb
 | 
						|
        }
 | 
						|
    }
 | 
						|
]
 | 
						|
 | 
						|
const Router = createRouter({
 | 
						|
    history: createWebHistory(),
 | 
						|
    routes
 | 
						|
})
 | 
						|
 | 
						|
Router.beforeEach((to, from, next) => {
 | 
						|
    if (to.meta.title != 'Home') {
 | 
						|
        document.title = `Wanderhome Quiz | V.S. - ${to.meta.title}`
 | 
						|
    } else {
 | 
						|
        document.title = `Wanderhome Quiz | V.S.`
 | 
						|
    }
 | 
						|
    next()
 | 
						|
})
 | 
						|
 | 
						|
Router.afterEach( (to, from) => {
 | 
						|
    const enterActiveClass = 'transition-all duration-300 origin-top ease-in'
 | 
						|
    const leaveActiveClass = 'transition-all duration-300 origin-top ease-out'
 | 
						|
    const baseFromClass = 'transform opacity-0 md:scale-75'
 | 
						|
    if ( to.fullPath.split('/')[1] !== from.fullPath.split('/')[1] || !from.matched.length ) {
 | 
						|
        const fromIndex = from.meta.parentIndex ? from.meta.parentIndex : from.meta.index
 | 
						|
        const toIndex = to.meta.parentIndex ? to.meta.parentIndex : to.meta.index
 | 
						|
        const slideInDirection = toIndex < fromIndex ? 'md:-translate-x-1/3' : 'md:translate-x-1/3'
 | 
						|
        const slideOutDirection = toIndex < fromIndex ? 'md:translate-x-1/3' : 'md:-translate-x-1/3'
 | 
						|
        to.meta.mainEnterActiveClass = enterActiveClass
 | 
						|
        to.meta.mainLeaveActiveClass = leaveActiveClass
 | 
						|
        to.meta.mainEnterFromClass = baseFromClass + ' ' + slideInDirection
 | 
						|
        to.meta.mainLeaveToClass = baseFromClass + ' ' + slideOutDirection
 | 
						|
    } else if ( to.fullPath.split('/')[1] == from.fullPath.split('/')[1] && from.matched.length ) {
 | 
						|
        const fromIndex = from.meta.index
 | 
						|
        const toIndex = to.meta.index
 | 
						|
        const slideInDirection = toIndex < fromIndex ? 'md:-translate-y-1/3' : 'md:translate-y-1/3'
 | 
						|
        const slideOutDirection = toIndex < fromIndex ? 'md:translate-y-1/3' : 'md:-translate-y-1/3'
 | 
						|
        to.meta.panelEnterActiveClass = enterActiveClass
 | 
						|
        to.meta.panelLeaveActiveClass = leaveActiveClass
 | 
						|
        to.meta.panelEnterFromClass = baseFromClass + ' ' + slideInDirection
 | 
						|
        to.meta.panelLeaveToClass = baseFromClass + ' ' + slideOutDirection
 | 
						|
    }
 | 
						|
})
 | 
						|
 | 
						|
export default Router |