mirror of
https://github.com/believethehype/nostrdvm.git
synced 2025-11-19 14:46:27 +01:00
post from noogle
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@rust-nostr/nostr-sdk": "^0.10.0",
|
"@rust-nostr/nostr-sdk": "^0.10.0",
|
||||||
|
"@vueuse/core": "^10.7.2",
|
||||||
"bootstrap": "^5.3.2",
|
"bootstrap": "^5.3.2",
|
||||||
"daisyui": "^4.6.0",
|
"daisyui": "^4.6.0",
|
||||||
"mini-toastr": "^0.8.1",
|
"mini-toastr": "^0.8.1",
|
||||||
|
|||||||
@@ -1,91 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="bg-gray-50 min-w-screen min-h-screen flex justify-center items-center">
|
|
||||||
<div class="max-w-xs relative space-y-3">
|
|
||||||
<label
|
|
||||||
for="search"
|
|
||||||
class="text-gray-900"
|
|
||||||
>
|
|
||||||
Type the name of a country to search
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
id="search"
|
|
||||||
v-model="searchTerm"
|
|
||||||
placeholder="Type here..."
|
|
||||||
class="p-3 mb-0.5 w-full border border-gray-300 rounded"
|
|
||||||
>
|
|
||||||
|
|
||||||
<ul
|
|
||||||
v-if="searchCountries.length"
|
|
||||||
class="w-full rounded bg-white border border-gray-300 px-4 py-2 space-y-1 absolute z-10"
|
|
||||||
>
|
|
||||||
<li class="px-1 pt-1 pb-2 font-bold border-b border-gray-200">
|
|
||||||
Showing {{ searchCountries.length }} of {{ countries.length }} results
|
|
||||||
</li>
|
|
||||||
<li
|
|
||||||
v-for="country in searchCountries"
|
|
||||||
:key="country.name"
|
|
||||||
@click="selectCountry(country.name)"
|
|
||||||
class="cursor-pointer hover:bg-gray-100 p-1"
|
|
||||||
>
|
|
||||||
{{ country.name }}
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p
|
|
||||||
v-if="selectedCountry"
|
|
||||||
class="text-lg pt-2 absolute"
|
|
||||||
>
|
|
||||||
You have selected: <span class="font-semibold">{{ selectedCountry }}</span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import countries from './data/countries.json'
|
|
||||||
import {ref, computed} from 'vue'
|
|
||||||
import '../app.css'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
setup() {
|
|
||||||
let searchTerm = ref('')
|
|
||||||
|
|
||||||
const searchCountries = computed(() => {
|
|
||||||
if (searchTerm.value === '') {
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
if (!searchTerm.value.includes(":from")) {
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
|
|
||||||
let newsearch = searchTerm.value.split(":from")
|
|
||||||
|
|
||||||
let matches = 0
|
|
||||||
|
|
||||||
return countries.filter(country => {
|
|
||||||
if (country.name.toLowerCase().includes(newsearch[1].toLowerCase()) && matches < 10) {
|
|
||||||
matches++
|
|
||||||
return country
|
|
||||||
}
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
const selectCountry = (country) => {
|
|
||||||
selectedCountry.value = country
|
|
||||||
searchTerm.value = ''
|
|
||||||
}
|
|
||||||
|
|
||||||
let selectedCountry = ref('')
|
|
||||||
|
|
||||||
return {
|
|
||||||
countries,
|
|
||||||
searchTerm,
|
|
||||||
searchCountries,
|
|
||||||
selectCountry,
|
|
||||||
selectedCountry
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Client,
|
Client,
|
||||||
Filter,
|
Filter,
|
||||||
@@ -13,28 +11,39 @@ import {
|
|||||||
EventBuilder,
|
EventBuilder,
|
||||||
Tag,
|
Tag,
|
||||||
EventId,
|
EventId,
|
||||||
Nip19Event, Alphabet
|
Nip19Event, Alphabet, Keys
|
||||||
} from "@rust-nostr/nostr-sdk";
|
} from "@rust-nostr/nostr-sdk";
|
||||||
import store from '../store';
|
import store from '../store';
|
||||||
import miniToastr from "mini-toastr";
|
import miniToastr from "mini-toastr";
|
||||||
import VueNotifications from "vue-notifications";
|
import VueNotifications from "vue-notifications";
|
||||||
import searchdvms from './data/searchdvms.json'
|
import searchdvms from './data/searchdvms.json'
|
||||||
import {computed, watch} from "vue";
|
import {computed, defineEmits, watch} from "vue";
|
||||||
import countries from "@/components/data/countries.json";
|
import countries from "@/components/data/countries.json";
|
||||||
import deadnip89s from "@/components/data/deadnip89s.json";
|
import deadnip89s from "@/components/data/deadnip89s.json";
|
||||||
import {data} from "autoprefixer";
|
import {data} from "autoprefixer";
|
||||||
import {requestProvider} from "webln";
|
import {requestProvider} from "webln";
|
||||||
|
import Newnote from "@/components/Newnote.vue";
|
||||||
|
|
||||||
let dvms =[]
|
let dvms =[]
|
||||||
let searching = false
|
let searching = false
|
||||||
|
|
||||||
let listener = false
|
let listener = false
|
||||||
|
|
||||||
|
function showDetails(user) {
|
||||||
|
this.$bvModal.show("modal-details");
|
||||||
|
this.modalData = user;
|
||||||
|
}
|
||||||
|
|
||||||
const sleep = (ms) => {
|
const sleep = (ms) => {
|
||||||
return new Promise(resolve => setTimeout(resolve, ms))
|
return new Promise(resolve => setTimeout(resolve, ms))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function post_note(note){
|
||||||
|
let client = store.state.client
|
||||||
|
await client.publishTextNote(note, []);
|
||||||
|
|
||||||
|
}
|
||||||
async function generate_image(message) {
|
async function generate_image(message) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -275,6 +284,25 @@ defineProps({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
import { ref } from "vue";
|
||||||
|
import ModalComponent from "../components/Newnote.vue";
|
||||||
|
|
||||||
|
const isModalOpened = ref(false);
|
||||||
|
const modalcontent = ref("");
|
||||||
|
|
||||||
|
const openModal = result => {
|
||||||
|
isModalOpened.value = true;
|
||||||
|
modalcontent.value = result
|
||||||
|
};
|
||||||
|
const closeModal = () => {
|
||||||
|
isModalOpened.value = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
const submitHandler = async () => {
|
||||||
|
console.log("hello")
|
||||||
|
await post_note(modalcontent)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
@@ -299,8 +327,17 @@ defineProps({
|
|||||||
</div>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
|
||||||
|
<ModalComponent :isOpen="isModalOpened" @modal-close="closeModal" @submit="submitHandler" name="first-modal">
|
||||||
|
<template #header>Share your creation on Nostr <br> <br></template>
|
||||||
|
|
||||||
|
<template #content><textarea v-model="modalcontent" className="c-Input" style="width: 400px; height: 300px;">{{modalcontent}}</textarea></template>
|
||||||
|
<template #footer><button className="v-Button" @click="post_note(modalcontent)" @click.stop="closeModal">Create Note</button></template>
|
||||||
|
</ModalComponent>
|
||||||
|
|
||||||
<div class="max-w-5xl relative space-y-3">
|
<div class="max-w-5xl relative space-y-3">
|
||||||
<div class="grid grid-cols-1 gap-6">
|
<div class="grid grid-cols-1 gap-6">
|
||||||
|
|
||||||
<div className="card w-70 bg-base-100 shadow-xl flex flex-col" v-for="dvm in store.state.imagedvmreplies"
|
<div className="card w-70 bg-base-100 shadow-xl flex flex-col" v-for="dvm in store.state.imagedvmreplies"
|
||||||
:key="dvm.id">
|
:key="dvm.id">
|
||||||
|
|
||||||
@@ -337,8 +374,22 @@ defineProps({
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
<figure className="w-full" >
|
<figure className="w-full" >
|
||||||
<img v-if="dvm.result" :src="dvm.result" className="tooltip" data-top='Click to copy url'height="200" alt="DVM Picture" @click="copyurl(dvm.result)"/>
|
<img v-if="dvm.result" :src="dvm.result" className="tooltip" data-top='Click to copy url' height="200" alt="DVM Picture" @click="copyurl(dvm.result)"/>
|
||||||
</figure>
|
</figure>
|
||||||
|
<div v-if="dvm.result && store.state.pubkey.toHex() !== Keys.fromSkStr('ece3c0aa759c3e895ecb3c13ab3813c0f98430c6d4bd22160b9c2219efc9cf0e').publicKey.toHex()" >
|
||||||
|
<button @click="openModal('Look what I created on noogle.lol\n\n' + dvm.result)" class="w-8 h-8 rounded-full bg-nostr border-white border-1 text-white flex items-center justify-center focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black tooltip" data-top='Share' aria-label="make note" role="button">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-pencil" width="20" height="20" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z"></path>
|
||||||
|
<path d="M4 20h4l10.5 -10.5a1.5 1.5 0 0 0 -4 -4l-10.5 10.5v4"></path>
|
||||||
|
<line x1="13.5" y1="6.5" x2="17.5" y2="10.5"></line>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- <button class="w-8 h-8 rounded-full bg-gray-100 dark:bg-gray-100 dark:text-gray-800 text-white flex items-center justify-center focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black" aria-label="edit note" role="button">
|
||||||
|
<svg class="icon icon-tabler icon-tabler-pencil" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"> <path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3" /></svg></button>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
58
ui/noogle/src/components/Newnote.vue
Normal file
58
ui/noogle/src/components/Newnote.vue
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<script setup>
|
||||||
|
import { defineProps, defineEmits, ref } from "vue";
|
||||||
|
import {onClickOutside} from '@vueuse/core'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
isOpen: Boolean,
|
||||||
|
});
|
||||||
|
|
||||||
|
const emit = defineEmits(["modal-close"]);
|
||||||
|
|
||||||
|
const target = ref(null)
|
||||||
|
onClickOutside(target, ()=>emit('modal-close'))
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div v-if="isOpen" class="modal-mask">
|
||||||
|
<div class="modal-wrapper">
|
||||||
|
<div class="modal-container" ref="target">
|
||||||
|
<div class="modal-header">
|
||||||
|
<slot name="header"> default header </slot>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<slot name="content"> default content </slot>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<slot name="footer">
|
||||||
|
<div>
|
||||||
|
<button @click.stop="emit('modal-close')">Submit</button>
|
||||||
|
</div>
|
||||||
|
</slot>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.modal-mask {
|
||||||
|
position: fixed;
|
||||||
|
z-index: 9998;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: rgba(0, 0, 0, 0.5);
|
||||||
|
}
|
||||||
|
.modal-container {
|
||||||
|
@apply bg-base-100;
|
||||||
|
width: 500px;
|
||||||
|
margin: 150px auto;
|
||||||
|
padding: 20px 30px;
|
||||||
|
//background-color: #181818;
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.33);
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -30,7 +30,7 @@ import {
|
|||||||
Filter,
|
Filter,
|
||||||
initLogger,
|
initLogger,
|
||||||
LogLevel,
|
LogLevel,
|
||||||
Timestamp, Keys, NostrDatabase, ClientBuilder, ClientZapper, Alphabet, SingleLetterTag
|
Timestamp, Keys, NostrDatabase, ClientBuilder, ClientZapper, Alphabet, SingleLetterTag, Options, Duration
|
||||||
} from "@rust-nostr/nostr-sdk";
|
} from "@rust-nostr/nostr-sdk";
|
||||||
import VueNotifications from "vue-notifications";
|
import VueNotifications from "vue-notifications";
|
||||||
import store from '../store';
|
import store from '../store';
|
||||||
@@ -77,7 +77,8 @@ export default {
|
|||||||
|
|
||||||
let keys = Keys.fromSkStr("ece3c0aa759c3e895ecb3c13ab3813c0f98430c6d4bd22160b9c2219efc9cf0e")
|
let keys = Keys.fromSkStr("ece3c0aa759c3e895ecb3c13ab3813c0f98430c6d4bd22160b9c2219efc9cf0e")
|
||||||
this.signer = ClientSigner.keys(keys) //TODO store keys
|
this.signer = ClientSigner.keys(keys) //TODO store keys
|
||||||
let client = new ClientBuilder().signer(this.signer).build()
|
let opts = new Options().waitForSend(false).connectionTimeout(Duration.fromSecs(5));
|
||||||
|
let client = new ClientBuilder().signer(this.signer).opts(opts).build()
|
||||||
|
|
||||||
for (const relay of store.state.relays){
|
for (const relay of store.state.relays){
|
||||||
await client.addRelay(relay);
|
await client.addRelay(relay);
|
||||||
@@ -133,7 +134,9 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//let zapper = ClientZapper.webln()
|
//let zapper = ClientZapper.webln()
|
||||||
let client = new ClientBuilder().signer(this.signer).build();
|
let opts = new Options().waitForSend(false).connectionTimeout(Duration.fromSecs(5));
|
||||||
|
let client = new ClientBuilder().signer(this.signer).opts(opts).build()
|
||||||
|
|
||||||
|
|
||||||
for (const relay of store.state.relays){
|
for (const relay of store.state.relays){
|
||||||
await client.addRelay(relay);
|
await client.addRelay(relay);
|
||||||
|
|||||||
@@ -16,13 +16,12 @@ const store = createStore({
|
|||||||
nip89dvms: [],
|
nip89dvms: [],
|
||||||
activesearchdvms: [],
|
activesearchdvms: [],
|
||||||
results: [],
|
results: [],
|
||||||
relays: [
|
relays: ["wss://relay.damus.io",
|
||||||
//"wss://relay.damus.io",
|
|
||||||
"wss://nos.lol",
|
"wss://nos.lol",
|
||||||
"wss://pablof7z.nostr1.com",
|
"wss://pablof7z.nostr1.com",
|
||||||
"wss://relay.nostr.net",
|
"wss://relay.nostr.net",
|
||||||
"wss://relay.nostr.band",
|
"wss://relay.nostr.band",
|
||||||
//"wss://nostr-pub.wellorder.net",
|
"wss://nostr-pub.wellorder.net",
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user