summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/vue/demo/components/chat.js63
-rw-r--r--plugins/vue/demo/components/name.js53
-rw-r--r--plugins/vue/demo/index.html79
3 files changed, 195 insertions, 0 deletions
diff --git a/plugins/vue/demo/components/chat.js b/plugins/vue/demo/components/chat.js
new file mode 100644
index 0000000..800ac45
--- /dev/null
+++ b/plugins/vue/demo/components/chat.js
@@ -0,0 +1,63 @@
+import { Name } from './name.js'
+
+export default {
+
+ components: { Name },
+
+ props: ['tags', 'objects'],
+
+ data: ()=> ({
+ message: ''
+ }),
+
+ computed: {
+ messages() {
+ return this.objects
+ .filter(o=>
+ 'message' in o &&
+ 'timestamp' in o &&
+ typeof o.message == 'string' &&
+ typeof o.timestamp == 'number')
+ .sortBy('timestamp')
+ }
+ },
+
+ methods: {
+ sendMessage() {
+ if (!this.message) return
+ this.$graffitiUpdate({
+ message: this.message,
+ timestamp: Date.now(),
+ _tags: this.tags
+ })
+ this.message = ''
+ }
+ },
+
+ template: `
+ <ul v-for="object in messages">
+ <li>
+ <graffiti-objects :tags="[object._by]" v-slot="{objects}">
+ <name :of="object._by" :objects="objects"></name>
+ </graffiti-objects>:
+
+ {{ object.message }}
+
+ <template v-if="object._by==$graffitiID.value">
+ <button @click="object.message+='!!';object._update()">
+ ‼️
+ </button>
+
+ <button @click="object._remove()">
+ ❌
+ </button>
+ </template>
+ </li>
+ </ul>
+
+ <form @submit.prevent="sendMessage">
+ <input v-model="message">
+ <input type="submit" value="Submit"/>
+ </form>`
+}
+
diff --git a/plugins/vue/demo/components/name.js b/plugins/vue/demo/components/name.js
new file mode 100644
index 0000000..ec1de62
--- /dev/null
+++ b/plugins/vue/demo/components/name.js
@@ -0,0 +1,53 @@
+export const Name = {
+
+ props: ["of", "objects"],
+
+ computed: {
+ name() {
+ const nameObjects = this.objects
+ .filter(o=>
+ 'name' in o &&
+ 'of' in o &&
+ 'timestamp' in o &&
+ typeof o.name == 'string' &&
+ o.of == this.of &&
+ o._by == this.of &&
+ typeof o.timestamp == 'number')
+ .sortBy('-timestamp')
+
+ return nameObjects.length?
+ nameObjects[0].name : 'anonymous'
+ }
+ },
+
+ template: '{{name}}'
+}
+
+export const SetMyName = {
+
+ props: ["tags"],
+
+ data: ()=> ({
+ name: ''
+ }),
+
+ methods: {
+ setMyName() {
+ this.$graffitiUpdate({
+ name: this.name,
+ timestamp: Date.now(),
+ of: this.$graffitiID.value,
+ _tags: this.tags
+ })
+ this.name = ''
+ }
+ },
+
+ template: `
+ <form @submit.prevent="setMyName">
+ <label for="nameBox">Change your name:</label>
+ <input v-model="name" id="nameBox"/>
+ <br>
+ <input type="submit" value="Submit"/>
+ </form>`
+}
diff --git a/plugins/vue/demo/index.html b/plugins/vue/demo/index.html
new file mode 100644
index 0000000..45e1ad3
--- /dev/null
+++ b/plugins/vue/demo/index.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Graffiti Vue</title>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css">
+ <script async src="https://ga.jspm.io/npm:es-module-shims@1.6.2/dist/es-module-shims.js"></script>
+ <script type="importmap">{ "imports": {
+ "vue": "https://cdnjs.cloudflare.com/ajax/libs/vue/3.2.45/vue.esm-browser.min.js",
+ "graffiti-vue": "../plugin.js"
+ }}</script>
+ <script type="module">
+ //"graffiti-vue": "https://graffiti.garden/graffiti-js/plugins/vue/plugin.js"
+ import { createApp } from 'vue'
+ import { Name, SetMyName } from './components/name.js'
+ import Chat from './components/chat.js'
+ import GraffitiVue from 'graffiti-vue'
+ createApp()
+ .use(GraffitiVue)
+ .component('Name', Name)
+ .component('SetMyName', SetMyName)
+ .component('Chat', Chat)
+ .mount('#app')
+ </script>
+</head>
+<body id="app">
+<!-------------------------------------------------------------->
+
+
+ <h1>
+ Logging In
+ </h1>
+
+ <p>
+ <button @click="$graffitiToggleLogIn">
+ {{ !$graffitiID.value? 'Log In' : 'Log Out' }}
+ </button>
+ </p>
+
+ <br>
+
+ <h1>
+ Profile
+ </h1>
+
+ <p>
+ My name is:
+ <graffiti-objects :tags="[$graffitiID.value]" v-slot="{objects}">
+ <name :of="$graffitiID.value" :objects="objects"></name>
+ </graffiti-objects>
+ </p>
+
+ <set-my-name :tags="[$graffitiID.value]"></set-my-name>
+
+ <br>
+
+ <h1>
+ Chatting
+ </h1>
+
+ <graffiti-objects :tags="['demo']" v-slot="{objects}">
+ <chat :tags="['demo']" :objects="objects"></chat>
+ </graffiti-objects>
+
+ <!-- Add a like button -->
+
+
+ <!-- Filter by likes -->
+
+
+ <!-- different contexts -->
+
+
+ <!-- Private messages -->
+
+<!-------------------------------------------------------------->
+</body>
+</html>