Initial commit
This commit is contained in:
		
							
								
								
									
										15
									
								
								.eslintrc.cjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								.eslintrc.cjs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
/* eslint-env node */
 | 
			
		||||
require('@rushstack/eslint-patch/modern-module-resolution')
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  root: true,
 | 
			
		||||
  'extends': [
 | 
			
		||||
    'plugin:vue/vue3-essential',
 | 
			
		||||
    'eslint:recommended',
 | 
			
		||||
    '@vue/eslint-config-typescript',
 | 
			
		||||
    '@vue/eslint-config-prettier/skip-formatting'
 | 
			
		||||
  ],
 | 
			
		||||
  parserOptions: {
 | 
			
		||||
    ecmaVersion: 'latest'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
# Logs
 | 
			
		||||
logs
 | 
			
		||||
*.log
 | 
			
		||||
npm-debug.log*
 | 
			
		||||
yarn-debug.log*
 | 
			
		||||
yarn-error.log*
 | 
			
		||||
pnpm-debug.log*
 | 
			
		||||
lerna-debug.log*
 | 
			
		||||
 | 
			
		||||
node_modules
 | 
			
		||||
.DS_Store
 | 
			
		||||
dist
 | 
			
		||||
dist-ssr
 | 
			
		||||
coverage
 | 
			
		||||
*.local
 | 
			
		||||
 | 
			
		||||
/cypress/videos/
 | 
			
		||||
/cypress/screenshots/
 | 
			
		||||
 | 
			
		||||
# Editor directories and files
 | 
			
		||||
.vscode/*
 | 
			
		||||
!.vscode/extensions.json
 | 
			
		||||
.idea
 | 
			
		||||
*.suo
 | 
			
		||||
*.ntvs*
 | 
			
		||||
*.njsproj
 | 
			
		||||
*.sln
 | 
			
		||||
*.sw?
 | 
			
		||||
 | 
			
		||||
*.tsbuildinfo
 | 
			
		||||
							
								
								
									
										8
									
								
								.prettierrc.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.prettierrc.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
  "$schema": "https://json.schemastore.org/prettierrc",
 | 
			
		||||
  "semi": false,
 | 
			
		||||
  "tabWidth": 2,
 | 
			
		||||
  "singleQuote": true,
 | 
			
		||||
  "printWidth": 100,
 | 
			
		||||
  "trailingComma": "none"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								components.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								components.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
/* eslint-disable */
 | 
			
		||||
// @ts-nocheck
 | 
			
		||||
// Generated by unplugin-vue-components
 | 
			
		||||
// Read more: https://github.com/vuejs/core/pull/3399
 | 
			
		||||
export {}
 | 
			
		||||
 | 
			
		||||
/* prettier-ignore */
 | 
			
		||||
declare module 'vue' {
 | 
			
		||||
  export interface GlobalComponents {
 | 
			
		||||
    Button: typeof import('primevue/button')['default']
 | 
			
		||||
    DataView: typeof import('primevue/dataview')['default']
 | 
			
		||||
    FullscreenCamera: typeof import('./src/components/FullscreenCamera.vue')['default']
 | 
			
		||||
    InputText: typeof import('primevue/inputtext')['default']
 | 
			
		||||
    RouterLink: typeof import('vue-router')['RouterLink']
 | 
			
		||||
    RouterView: typeof import('vue-router')['RouterView']
 | 
			
		||||
    Tag: typeof import('primevue/tag')['default']
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="UTF-8">
 | 
			
		||||
    <link rel="icon" href="/favicon.ico">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
    <title>Vite App</title>
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <div id="app"></div>
 | 
			
		||||
    <script type="module" src="/src/main.ts"></script>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										4511
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										4511
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										46
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "camera-app",
 | 
			
		||||
  "version": "0.0.0",
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "type": "module",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "dev": "vite",
 | 
			
		||||
    "build": "run-p type-check \"build-only {@}\" --",
 | 
			
		||||
    "preview": "vite preview",
 | 
			
		||||
    "build-only": "vite build",
 | 
			
		||||
    "type-check": "vue-tsc --build --force",
 | 
			
		||||
    "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore",
 | 
			
		||||
    "format": "prettier --write src/"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@primevue/themes": "^4.1.0",
 | 
			
		||||
    "axios": "^1.7.7",
 | 
			
		||||
    "pinia": "^2.1.7",
 | 
			
		||||
    "primevue": "^4.1.0",
 | 
			
		||||
    "simple-vue-camera": "^1.1.3",
 | 
			
		||||
    "tailwindcss-primeui": "^0.3.4",
 | 
			
		||||
    "vue": "^3.4.29",
 | 
			
		||||
    "vue-router": "^4.3.3"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@primevue/auto-import-resolver": "^4.1.0",
 | 
			
		||||
    "@rushstack/eslint-patch": "^1.8.0",
 | 
			
		||||
    "@tsconfig/node20": "^20.1.4",
 | 
			
		||||
    "@types/node": "^20.14.5",
 | 
			
		||||
    "@vitejs/plugin-vue": "^5.0.5",
 | 
			
		||||
    "@vue/eslint-config-prettier": "^9.0.0",
 | 
			
		||||
    "@vue/eslint-config-typescript": "^13.0.0",
 | 
			
		||||
    "@vue/tsconfig": "^0.5.1",
 | 
			
		||||
    "autoprefixer": "^10.4.20",
 | 
			
		||||
    "eslint": "^8.57.0",
 | 
			
		||||
    "eslint-plugin-vue": "^9.23.0",
 | 
			
		||||
    "npm-run-all2": "^6.2.0",
 | 
			
		||||
    "postcss": "^8.4.47",
 | 
			
		||||
    "prettier": "^3.2.5",
 | 
			
		||||
    "tailwindcss": "^3.4.13",
 | 
			
		||||
    "typescript": "~5.4.0",
 | 
			
		||||
    "unplugin-vue-components": "^0.27.4",
 | 
			
		||||
    "vite": "^5.3.1",
 | 
			
		||||
    "vue-tsc": "^2.0.21"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								postcss.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								postcss.config.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
export default {
 | 
			
		||||
  plugins: {
 | 
			
		||||
    tailwindcss: {},
 | 
			
		||||
    autoprefixer: {},
 | 
			
		||||
  },
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								public/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								public/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 4.2 KiB  | 
							
								
								
									
										10
									
								
								src/App.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/App.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import { RouterLink, RouterView } from 'vue-router'
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
  <RouterView />
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
</style>
 | 
			
		||||
@@ -0,0 +1 @@
 | 
			
		||||
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#FFFFFF"><path d="M236-477q0 60 21.5 103.5T319-298l25 16v-74q0-13 9.5-23t25.5-10q13 0 23 10t10 23v162q0 21-13 33.5T367-148H206q-15 0-24.5-10t-9.5-25q0-13 9.5-23t25.5-10h70l-6-6q-66-56-96.5-117T144-477q0-102 55.5-184T345-784q15-8 29.5 1.5T394-755q3 18-5.5 34T367-696q-62 32-96.5 91T236-477Zm489-7q0-44-23-90.5T644-657l-24-21v73q0 14-10 24t-24 10q-14 0-24.5-10.5T551-606v-161q0-20 13-32.5t34-12.5h160q14 0 24 9.5t10 23.5q0 14-10 24.5T758-744h-73l7 8q63 57 94 124t31 128q0 102-53.5 183.5T620-177q-16 9-31.5 0T569-205q-5-18 3-34t24-25q60-31 94.5-90.5T725-484Z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 662 B  | 
							
								
								
									
										106
									
								
								src/components/FullscreenCamera.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								src/components/FullscreenCamera.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,106 @@
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import { ref } from 'vue'
 | 
			
		||||
import type Camera from 'simple-vue-camera'
 | 
			
		||||
import { useSiteControlStore } from '@/stores/siteControlStore'
 | 
			
		||||
import { useCheckpointStore } from '@/stores/checkpointStore'
 | 
			
		||||
import { storeToRefs } from 'pinia'
 | 
			
		||||
import type { CheckpointPhoto } from '@/main'
 | 
			
		||||
 | 
			
		||||
const camera = ref<InstanceType<typeof Camera>>();
 | 
			
		||||
const photosList = ref<Array<Blob>>([]);
 | 
			
		||||
const lastestPhoto = ref<string>();
 | 
			
		||||
const siteControlStore = useSiteControlStore();
 | 
			
		||||
const checkpointStore = useCheckpointStore();
 | 
			
		||||
const { currentCheckpoint } = storeToRefs(checkpointStore);
 | 
			
		||||
 | 
			
		||||
const snapshot = async () => {
 | 
			
		||||
  const blob = await camera.value?.snapshot({ width: 540, height: 960 },"image/png",
 | 
			
		||||
    1);
 | 
			
		||||
  console.log(blob);
 | 
			
		||||
  // To show the screenshot with an image tag, create a url
 | 
			
		||||
  if(blob != undefined) {
 | 
			
		||||
    const url = URL.createObjectURL(blob);
 | 
			
		||||
    photosList.value.push(blob);
 | 
			
		||||
    var link = document.createElement('a');
 | 
			
		||||
    link.download = `vue-cam-${new Date().toISOString()}.png`;
 | 
			
		||||
    link.href = url;
 | 
			
		||||
    if (currentCheckpoint.value == undefined) {
 | 
			
		||||
      currentCheckpoint.value = {} as CheckpointPhoto;
 | 
			
		||||
    }
 | 
			
		||||
    currentCheckpoint.value.photoURL = url;
 | 
			
		||||
    currentCheckpoint.value.photoBlob = blob;
 | 
			
		||||
    // link.click();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
function switchCamera() {
 | 
			
		||||
  siteControlStore.switchCameraState();
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
  <camera-component ref="camera" autoplay style="display: flex; position: relative; align-items: center" >
 | 
			
		||||
    <div style="display: flex; justify-content: center; align-items: center; height: 100%">
 | 
			
		||||
      <div @click="snapshot" class="photo-button" style="align-content: center;">
 | 
			
		||||
        <div class="circle"></div>
 | 
			
		||||
        <div class="ring"></div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div @click="switchCamera" class="swap-button" style="align-content: center;">
 | 
			
		||||
        <img src="/home/patryk/WebstormProjects/camera-app/src/assets/sync_200dp_FFFFFF_FILL0_wght700_GRAD200_opsz48.svg" style="height:80px; margin-left: 10px"/>
 | 
			
		||||
        <div class="ring"></div>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
    </div>
 | 
			
		||||
  </camera-component>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
.photo-button {
 | 
			
		||||
  width: 100px;
 | 
			
		||||
  height: 100px;
 | 
			
		||||
  top: 75%;
 | 
			
		||||
  left: 25%;
 | 
			
		||||
  margin-left: -50px;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
}
 | 
			
		||||
.swap-button {
 | 
			
		||||
  width: 100px;
 | 
			
		||||
  height: 100px;
 | 
			
		||||
  top: 75%;
 | 
			
		||||
  left: 75%;
 | 
			
		||||
  margin-left: -50px;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
}
 | 
			
		||||
.circle {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  top: 12%;
 | 
			
		||||
  left: 12%;
 | 
			
		||||
  bottom: 12%;
 | 
			
		||||
  right: 12%;
 | 
			
		||||
  border-radius: 100%;
 | 
			
		||||
  background-color: #ffffff;
 | 
			
		||||
  opacity: 0;
 | 
			
		||||
}
 | 
			
		||||
.ring {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  left: 0;
 | 
			
		||||
  bottom: 0;
 | 
			
		||||
  right: 0;
 | 
			
		||||
 | 
			
		||||
  border-radius: 100%;
 | 
			
		||||
  border: 0.5em solid #ffffff;
 | 
			
		||||
  opacity: 0.8;
 | 
			
		||||
}
 | 
			
		||||
.photo-button .circle, .photo-button .ring {
 | 
			
		||||
  transition: all 0.25s;
 | 
			
		||||
}
 | 
			
		||||
.photo-button:hover .circle {
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
}
 | 
			
		||||
.photo-button:active .ring {
 | 
			
		||||
  opacity: 1;
 | 
			
		||||
}
 | 
			
		||||
.photo-button:active .circle {
 | 
			
		||||
  opacity: 0.5;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										42
									
								
								src/main.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/main.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
import '../src/style.css'
 | 
			
		||||
 | 
			
		||||
import { createApp } from 'vue'
 | 
			
		||||
import { createPinia } from 'pinia'
 | 
			
		||||
 | 
			
		||||
import PrimeVue from 'primevue/config';
 | 
			
		||||
import Aura from '@primevue/themes/aura';
 | 
			
		||||
import App from './App.vue'
 | 
			
		||||
import router from './router'
 | 
			
		||||
import Camera from 'simple-vue-camera'
 | 
			
		||||
import axios from 'axios'
 | 
			
		||||
 | 
			
		||||
const app = createApp(App)
 | 
			
		||||
 | 
			
		||||
app.use(createPinia())
 | 
			
		||||
app.use(router)
 | 
			
		||||
app.component("cameraComponent", Camera)
 | 
			
		||||
app.use(PrimeVue, {
 | 
			
		||||
  theme: {
 | 
			
		||||
    preset: Aura,
 | 
			
		||||
    options: {
 | 
			
		||||
      cssLayer: {
 | 
			
		||||
        name: 'primevue',
 | 
			
		||||
        order: 'tailwind-base, primevue, tailwind-utilities'
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export const axiosInstance = axios.create({
 | 
			
		||||
  baseURL: 'http://inspekcja.mleczarnia-kuzma.pl/api',
 | 
			
		||||
  withCredentials: true
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export interface CheckpointPhoto {
 | 
			
		||||
  photoBlob: Blob,
 | 
			
		||||
  comment: string,
 | 
			
		||||
  photoURL: string,
 | 
			
		||||
  checkpointName: string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
app.mount('#app')
 | 
			
		||||
							
								
								
									
										23
									
								
								src/router/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/router/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
import { createRouter, createWebHistory } from 'vue-router'
 | 
			
		||||
import HomeView from '../views/HomeView.vue'
 | 
			
		||||
 | 
			
		||||
const router = createRouter({
 | 
			
		||||
  history: createWebHistory(import.meta.env.BASE_URL),
 | 
			
		||||
  routes: [
 | 
			
		||||
    {
 | 
			
		||||
      path: '/',
 | 
			
		||||
      name: 'home',
 | 
			
		||||
      component: HomeView
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: '/about',
 | 
			
		||||
      name: 'about',
 | 
			
		||||
      // route level code-splitting
 | 
			
		||||
      // this generates a separate chunk (About.[hash].js) for this route
 | 
			
		||||
      // which is lazy-loaded when the route is visited.
 | 
			
		||||
      component: () => import('../views/AboutView.vue')
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
export default router
 | 
			
		||||
							
								
								
									
										40
									
								
								src/stores/checkpointStore.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/stores/checkpointStore.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
import { ref, computed } from 'vue'
 | 
			
		||||
import { defineStore } from 'pinia'
 | 
			
		||||
import type { CheckpointPhoto } from '@/main'
 | 
			
		||||
import image1 from '@/assets/462543062_571956811847971_6091192186898499954_n.jpg'
 | 
			
		||||
import image2 from '@/assets/462543273_1547886179452155_4598127063523571403_n.jpg'
 | 
			
		||||
import image3 from '@/assets/462555442_563827316092754_1417971777838745605_n.jpg'
 | 
			
		||||
import image4 from '@/assets/462561044_1684289689086565_883327244306079067_n.jpg'
 | 
			
		||||
 | 
			
		||||
export const useCheckpointStore = defineStore('checkpoint', () => {
 | 
			
		||||
  const checkpointList = ref<Array<CheckpointPhoto>>([
 | 
			
		||||
    {
 | 
			
		||||
      photoURL: image1,
 | 
			
		||||
      photoBlob: new Blob(),
 | 
			
		||||
      comment: "",
 | 
			
		||||
      checkpointName: "checkpoint 1"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      photoURL: image2,
 | 
			
		||||
      photoBlob: new Blob(),
 | 
			
		||||
      comment: "",
 | 
			
		||||
      checkpointName: "checkpoint 2"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      photoURL: image3,
 | 
			
		||||
      photoBlob: new Blob(),
 | 
			
		||||
      comment: "",
 | 
			
		||||
      checkpointName: "checkpoint 3"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      photoURL: image4,
 | 
			
		||||
      photoBlob: new Blob(),
 | 
			
		||||
      comment: "",
 | 
			
		||||
      checkpointName: "checkpoint 4"
 | 
			
		||||
    }
 | 
			
		||||
  ]);
 | 
			
		||||
 | 
			
		||||
  const currentCheckpoint = ref<CheckpointPhoto>();
 | 
			
		||||
 | 
			
		||||
  return {checkpointList, currentCheckpoint}
 | 
			
		||||
})
 | 
			
		||||
							
								
								
									
										12
									
								
								src/stores/siteControlStore.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/stores/siteControlStore.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
import { ref, computed } from 'vue'
 | 
			
		||||
import { defineStore } from 'pinia'
 | 
			
		||||
 | 
			
		||||
export const useSiteControlStore = defineStore('siteControl', () => {
 | 
			
		||||
  const isCameraOn = ref<boolean>(false);
 | 
			
		||||
 | 
			
		||||
  function switchCameraState() {
 | 
			
		||||
    isCameraOn.value = !isCameraOn.value;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return { isCameraOn, switchCameraState }
 | 
			
		||||
})
 | 
			
		||||
							
								
								
									
										14
									
								
								src/style.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/style.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
@tailwind base;
 | 
			
		||||
@tailwind components;
 | 
			
		||||
@tailwind utilities;
 | 
			
		||||
 | 
			
		||||
@layer tailwind-base, primevue, tailwind-utilities;
 | 
			
		||||
 | 
			
		||||
@layer tailwind-base {
 | 
			
		||||
    @tailwind base;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@layer tailwind-utilities {
 | 
			
		||||
    @tailwind components;
 | 
			
		||||
    @tailwind utilities;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										95
									
								
								src/views/HomeView.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								src/views/HomeView.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,95 @@
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import type Camera from 'simple-vue-camera'
 | 
			
		||||
import { ref } from 'vue'
 | 
			
		||||
import { useSiteControlStore } from '@/stores/siteControlStore'
 | 
			
		||||
import { storeToRefs } from 'pinia'
 | 
			
		||||
import { axiosInstance, type CheckpointPhoto } from '@/main'
 | 
			
		||||
import FullscreenCamera from '@/components/FullscreenCamera.vue'
 | 
			
		||||
import { useCheckpointStore } from '@/stores/checkpointStore'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const camera = ref<InstanceType<typeof Camera>>();
 | 
			
		||||
const lastestPhoto = ref<string>();
 | 
			
		||||
 | 
			
		||||
const siteControlStore = useSiteControlStore();
 | 
			
		||||
const checkpointStore = useCheckpointStore();
 | 
			
		||||
const { isCameraOn } = storeToRefs(siteControlStore);
 | 
			
		||||
const { checkpointList, currentCheckpoint } = storeToRefs(checkpointStore);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function switchCamera(checkpoint : CheckpointPhoto) {
 | 
			
		||||
  currentCheckpoint.value = checkpoint;
 | 
			
		||||
  siteControlStore.switchCameraState();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function sendPhoto() {
 | 
			
		||||
  // let reader = new FileReader();
 | 
			
		||||
  // let base64String;
 | 
			
		||||
  // reader.readAsDataURL(photosList.value[0].photoBlob);
 | 
			
		||||
  // reader.onloadend = function () {
 | 
			
		||||
  //   base64String = reader.result as string;
 | 
			
		||||
  //   console.log('Base64 String - ', base64String);
 | 
			
		||||
  //
 | 
			
		||||
  //   // Simply Print the Base64 Encoded String,
 | 
			
		||||
  //   // without additional data: Attributes.
 | 
			
		||||
  //   console.log('Base64 String without Tags- ',
 | 
			
		||||
  //     base64String.substring(base64String.indexOf(',') + 1));
 | 
			
		||||
  //   const json = {
 | 
			
		||||
  //     comment: 'test test',
 | 
			
		||||
  //     filename: 'test.png',
 | 
			
		||||
  //     base64: base64String
 | 
			
		||||
  //   }
 | 
			
		||||
  //   console.log(JSON.stringify(json));
 | 
			
		||||
  //   // axiosInstance.post('/upload', JSON.stringify(json)).then( response => {
 | 
			
		||||
  //   //   console.log(response);
 | 
			
		||||
  //   // });
 | 
			
		||||
  //}
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
  <FullscreenCamera v-if="isCameraOn == true"/>
 | 
			
		||||
  <div v-else>
 | 
			
		||||
    <DataView :value="checkpointList" layout="grid" data-key="">
 | 
			
		||||
      <template #grid="slotProps">
 | 
			
		||||
        <div class="grid grid-cols-12 gap-4">
 | 
			
		||||
          <div v-for="(item, index) in slotProps.items" :key="index" class="col-span-12 sm:col-span-6 md:col-span-4 xl:col-span-6 p-2">
 | 
			
		||||
            <div class="p-6 border border-surface-200 dark:border-surface-700 bg-surface-0 dark:bg-surface-900 rounded flex flex-col h-[100%]">
 | 
			
		||||
              <div class="bg-surface-50 flex justify-center rounded p-4 h-[inherit]">
 | 
			
		||||
                <div class="relative mx-auto flex align-middle">
 | 
			
		||||
                  <img class="rounded w-full" :src="item.photoURL" :alt="item.name" style="max-width: 300px" v-if="item.photoURL != undefined"/>
 | 
			
		||||
                  <span class="font-medium text-center self-center h-auto" v-else>Zrób zdjęcie</span>
 | 
			
		||||
                </div>
 | 
			
		||||
              </div>
 | 
			
		||||
              <div class="pt-6">
 | 
			
		||||
                <div class="flex flex-row justify-between items-start gap-2">
 | 
			
		||||
                  <div>
 | 
			
		||||
                    <div class="text-xl font-bold mt-1">{{ item.checkpointName }}</div>
 | 
			
		||||
                  </div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="flex flex-col gap-6 mt-4">
 | 
			
		||||
                  <div>
 | 
			
		||||
                    <label for="fluid" class="font-medium mb-2 block">Komentarz</label>
 | 
			
		||||
                    <InputText v-model="item.comment" fluid />
 | 
			
		||||
                  </div>
 | 
			
		||||
                  <div class="flex gap-2">
 | 
			
		||||
                    <Button icon="pi pi-shopping-cart" label="Otwórz kamerę" class="flex-auto whitespace-nowrap" @click="switchCamera(item)"></Button>
 | 
			
		||||
                  </div>
 | 
			
		||||
                </div>
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </template>
 | 
			
		||||
    </DataView>
 | 
			
		||||
    <Button label="Send photo" @click="sendPhoto"/>
 | 
			
		||||
    <h1 class="text-3xl font-bold underline">
 | 
			
		||||
      Hello world!
 | 
			
		||||
    </h1>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										13
									
								
								tailwind.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								tailwind.config.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
/** @type {import('tailwindcss').Config} */
 | 
			
		||||
// eslint-disable-next-line no-undef
 | 
			
		||||
module.exports = {
 | 
			
		||||
  content: [
 | 
			
		||||
    "./index.html",
 | 
			
		||||
    "./src/**/*.{vue,js,ts,jsx,tsx}",
 | 
			
		||||
  ],
 | 
			
		||||
  theme: {
 | 
			
		||||
    extend: {},
 | 
			
		||||
  },
 | 
			
		||||
  // eslint-disable-next-line no-undef
 | 
			
		||||
  plugins: [require('tailwindcss-primeui')],
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								tsconfig.app.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								tsconfig.app.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
{
 | 
			
		||||
  "extends": "@vue/tsconfig/tsconfig.dom.json",
 | 
			
		||||
  "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
 | 
			
		||||
  "exclude": ["src/**/__tests__/*"],
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "composite": true,
 | 
			
		||||
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
 | 
			
		||||
 | 
			
		||||
    "baseUrl": ".",
 | 
			
		||||
    "paths": {
 | 
			
		||||
      "@/*": ["./src/*"]
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
{
 | 
			
		||||
  "files": [],
 | 
			
		||||
  "references": [
 | 
			
		||||
    {
 | 
			
		||||
      "path": "./tsconfig.node.json"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "path": "./tsconfig.app.json"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								tsconfig.node.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								tsconfig.node.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
{
 | 
			
		||||
  "extends": "@tsconfig/node20/tsconfig.json",
 | 
			
		||||
  "include": [
 | 
			
		||||
    "vite.config.*",
 | 
			
		||||
    "vitest.config.*",
 | 
			
		||||
    "cypress.config.*",
 | 
			
		||||
    "nightwatch.conf.*",
 | 
			
		||||
    "playwright.config.*"
 | 
			
		||||
  ],
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "composite": true,
 | 
			
		||||
    "noEmit": true,
 | 
			
		||||
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
 | 
			
		||||
 | 
			
		||||
    "module": "ESNext",
 | 
			
		||||
    "moduleResolution": "Bundler",
 | 
			
		||||
    "types": ["node"]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										23
									
								
								vite.config.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								vite.config.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
import { fileURLToPath, URL } from 'node:url'
 | 
			
		||||
 | 
			
		||||
import { defineConfig } from 'vite'
 | 
			
		||||
import vue from '@vitejs/plugin-vue'
 | 
			
		||||
import Components from 'unplugin-vue-components/vite';
 | 
			
		||||
import {PrimeVueResolver} from '@primevue/auto-import-resolver';
 | 
			
		||||
 | 
			
		||||
// https://vitejs.dev/config/
 | 
			
		||||
export default defineConfig({
 | 
			
		||||
  plugins: [
 | 
			
		||||
    vue(),
 | 
			
		||||
    Components({
 | 
			
		||||
      resolvers: [
 | 
			
		||||
        PrimeVueResolver()
 | 
			
		||||
      ]
 | 
			
		||||
    }),
 | 
			
		||||
  ],
 | 
			
		||||
  resolve: {
 | 
			
		||||
    alias: {
 | 
			
		||||
      '@': fileURLToPath(new URL('./src', import.meta.url))
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
		Reference in New Issue
	
	Block a user