That's a huge commit if you ask me

This commit is contained in:
Florian Sylvain
2023-02-21 14:00:29 +01:00
parent ce0ab23555
commit a1b8716bc2
13 changed files with 3615 additions and 409 deletions
+2
View File
@@ -26,3 +26,5 @@ coverage
*.njsproj *.njsproj
*.sln *.sln
*.sw? *.sw?
.env
+5
View File
@@ -0,0 +1,5 @@
{
"tabWidth": 4,
"useTabs": true,
"semi": false
}
+11
View File
@@ -8,6 +8,17 @@ This template should help get you started developing with Vue 3 in Vite.
npm install npm install
``` ```
### Environment variables
```
VITE_apiKey=
VITE_authDomain=
VITE_projectId=
VITE_storageBucket=
VITE_messagingSenderId=
VITE_appId=
```
### Compile and Hot-Reload for Development ### Compile and Hot-Reload for Development
```sh ```sh
+1 -1
View File
@@ -2,7 +2,7 @@ rules_version = '2';
service cloud.firestore { service cloud.firestore {
match /databases/{database}/documents { match /databases/{database}/documents {
match /{document=**} { match /{document=**} {
allow read, write: if false; allow read, write: if true;
} }
} }
} }
+3430 -377
View File
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -10,7 +10,8 @@
"type-check": "vue-tsc --noEmit" "type-check": "vue-tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"firebase": "^9.17.0", "firebase": "^9.17.1",
"firebase-admin": "^11.5.0",
"pinia": "^2.0.28", "pinia": "^2.0.28",
"vue": "^3.2.45", "vue": "^3.2.45",
"vue-router": "^4.1.6" "vue-router": "^4.1.6"
+23
View File
@@ -0,0 +1,23 @@
<script setup lang="ts">
import { useSessionStore } from "@/stores/useSessionStore"
import { ref } from "vue"
const sessionStore = useSessionStore()
const nickname = ref("")
function setNickname() {
sessionStore.nickname = nickname.value
}
</script>
<template>
<h2>Group {{ sessionStore.groupId }}</h2>
<form @submit.prevent="setNickname">
<label for="nickname">Nickname</label>
<input type="text" id="nickname" name="nickname" v-model="nickname" />
<button type="submit">confirm</button>
</form>
</template>
<style scoped></style>
+16 -5
View File
@@ -1,5 +1,13 @@
import { createRouter, createWebHistory } from 'vue-router' import { createRouter, createWebHistory } from 'vue-router'
import GroupSelection from '@/views/GroupSelection.vue' import GroupSelection from '@/views/GroupSelection.vue'
import { doc, getDoc } from "firebase/firestore"
import { db } from '@/utils/firestore'
import { useSessionStore } from '@/stores/useSessionStore'
async function isGroupOk(id: string): Promise<boolean> {
const docSnap = await getDoc(doc(db, "groups", id))
return docSnap.exists()
}
const router = createRouter({ const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL), history: createWebHistory(import.meta.env.BASE_URL),
@@ -10,12 +18,15 @@ const router = createRouter({
component: GroupSelection component: GroupSelection
}, },
{ {
path: '/group', path: '/group/:groupId',
name: 'Group', name: 'Group',
component: GroupSelection, component: () => import('@/views/Chat.vue'),
// beforeEnter: (to, from) => { beforeEnter: async (to, from) => {
// return '/' const sessionStore = useSessionStore()
// } const userAllowed = await isGroupOk(to.params.groupId as string)
if (!userAllowed) return '/'
sessionStore.groupId = to.params.groupId as string
}
}, },
] ]
}) })
+9
View File
@@ -0,0 +1,9 @@
import { defineStore } from "pinia"
import { ref, type Ref } from "vue"
export const useSessionStore = defineStore('session', () => {
const groupId: Ref<string | undefined> = ref(undefined)
const nickname: Ref<string | undefined> = ref(undefined)
return { groupId, nickname }
})
+14
View File
@@ -0,0 +1,14 @@
import { initializeApp } from "@firebase/app"
import { getFirestore } from "@firebase/firestore"
const firebaseConfig = {
apiKey: import.meta.env.VITE_apiKey,
authDomain: import.meta.env.VITE_authDomain,
projectId: import.meta.env.VITE_projectId,
storageBucket: import.meta.env.VITE_storageBucket,
messagingSenderId: import.meta.env.VITE_messagingSenderId,
appId: import.meta.env.VITE_appId,
}
const app = initializeApp(firebaseConfig)
export const db = getFirestore(app)
+76 -1
View File
@@ -1,11 +1,86 @@
<script setup lang="ts"> <script setup lang="ts">
import NicknameSelection from "@/components/nicknameSelection.vue"
import { useSessionStore } from "@/stores/useSessionStore"
import { db } from "@/utils/firestore"
import {
addDoc,
collection,
onSnapshot,
QuerySnapshot,
type DocumentData,
} from "@firebase/firestore"
import { onMounted, ref, type Ref } from "vue"
const sessionStore = useSessionStore()
const messages: Ref<Array<DocumentData>> = ref([])
const currentMessage = ref("")
const lastUserMessageId = ref("")
const messagesPath = collection(
db,
"groups",
sessionStore.groupId as string,
"messages"
)
interface Message {
author: string
message: string
}
async function postMessage(): Promise<void> {
const message: Message = {
author: sessionStore.nickname as string,
message: currentMessage.value,
}
const messageReference = await addDoc(messagesPath, message)
lastUserMessageId.value = messageReference.id
}
function updateMessages(querSnap: QuerySnapshot<DocumentData>): void {
console.log(querSnap.docs) // TODO
}
onMounted(() => {
if (!sessionStore.groupId) return
onSnapshot(messagesPath, updateMessages)
})
</script> </script>
<template> <template>
<NicknameSelection v-if="!sessionStore.nickname"></NicknameSelection>
<template v-else>
<div class="messages">
<div>
<h3>Author</h3>
<p>Author's message</p>
</div>
</div>
<form @submit.prevent="postMessage">
<label for="message">Message</label>
<input
type="text"
name="message"
id="message"
v-model="currentMessage"
/>
<button type="submit">Send</button>
</form>
</template>
</template> </template>
<style scoped> <style scoped>
.messages > div {
padding: 16px;
}
</style> .messages > div h3,
.messages > div p {
margin: 0;
}
</style>
+26 -13
View File
@@ -1,24 +1,37 @@
<script setup lang="ts"> <script setup lang="ts">
import { initializeApp } from "firebase/app" import { useSessionStore } from "@/stores/useSessionStore"
import { db } from "@/utils/firestore"
import { collection, addDoc, type DocumentData } from "firebase/firestore"
import { ref } from "vue"
import { useRouter } from "vue-router"
const firebaseConfig = { const router = useRouter()
apiKey: "AIzaSyDVyP3WELYiQL8OBGFaLpCkZr8gA9cVu-4", const sessionStore = useSessionStore()
authDomain: "spacemessenger-fsylvain.firebaseapp.com",
projectId: "spacemessenger-fsylvain", const group = ref("")
storageBucket: "spacemessenger-fsylvain.appspot.com",
messagingSenderId: "103202352459", async function getGroup(): Promise<DocumentData | undefined> {
appId: "1:103202352459:web:c41f6a1e35492bbd8e4cce" try {
return await addDoc(collection(db, "groups"), {})
} catch (error) {
console.error("Error adding document: ", error)
return undefined
}
} }
const app = initializeApp(firebaseConfig) async function createGroup() {
const group = await getGroup()
if (group?.id == undefined) return
sessionStore.groupId = group.id
router.push(`/group/${group.id}`)
}
</script> </script>
<template> <template>
<h1>Space Messenger</h1> <h1>Space Messenger</h1>
<button>create a group</button> <button @click="() => createGroup()">create a group</button>
</template> </template>
<style scoped> <style scoped></style>
</style>
-11
View File
@@ -1,11 +0,0 @@
<script setup lang="ts">
</script>
<template>
</template>
<style scoped>
</style>