problem: not clear when a merit request is approved

This commit is contained in:
gsovereignty
2024-07-17 12:35:34 +08:00
parent a1e6ba0160
commit 16c0a55d79
4 changed files with 75 additions and 31 deletions

View File

@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import * as Card from '$lib/components/ui/card/index.js'; import * as Card from '$lib/components/ui/card/index.js';
import { MapOfVotes, Vote, Votes, type MeritRequest } from '@/event_helpers/merits'; import { MapOfVotes, Votes, type MeritRequest, type VoteDirection } from '@/event_helpers/merits';
import { ndk } from '@/ndk'; import { ndk } from '@/ndk';
import { NDKEvent, type NDKKind } from '@nostr-dev-kit/ndk'; import { NDKEvent, type NDKKind } from '@nostr-dev-kit/ndk';
import { Avatar, Name } from '@nostr-dev-kit/ndk-svelte-components'; import { Avatar, Name } from '@nostr-dev-kit/ndk-svelte-components';
@@ -14,18 +14,20 @@
import { getRocketURL, unixToRelativeTime } from '@/helpers'; import { getRocketURL, unixToRelativeTime } from '@/helpers';
import { derived } from 'svelte/store'; import { derived } from 'svelte/store';
import { goto } from '$app/navigation';
import { base } from '$app/paths';
import { Button } from '$lib/components/ui/button/index.js'; import { Button } from '$lib/components/ui/button/index.js';
import { Label } from '$lib/components/ui/label/index.js'; import { Label } from '$lib/components/ui/label/index.js';
import { Textarea } from '$lib/components/ui/textarea/index.js'; import { Textarea } from '$lib/components/ui/textarea/index.js';
import Alert from '@/components/ui/alert/alert.svelte';
import { currentUser } from '@/stores/session'; import { currentUser } from '@/stores/session';
import CornerDownLeft from 'lucide-svelte/icons/corner-down-left'; import CornerDownLeft from 'lucide-svelte/icons/corner-down-left';
import { goto } from '$app/navigation'; import Alert from './Alert.svelte';
import { base } from '$app/paths';
export let merit: MeritRequest; export let merit: MeritRequest;
export let rocket: NDKEvent; export let rocket: NDKEvent;
let result: VoteDirection | undefined;
let parsedRocket = new Rocket(rocket); let parsedRocket = new Rocket(rocket);
let _votes = $ndk.storeSubscribe( let _votes = $ndk.storeSubscribe(
@@ -45,10 +47,15 @@
let rocketUpdates = derived([votes, currentUser], ([$votes, $currentUser]) => { let rocketUpdates = derived([votes, currentUser], ([$votes, $currentUser]) => {
let events: NDKEvent[] = []; let events: NDKEvent[] = [];
if ($currentUser && parsedRocket && parsedRocket.VotePowerForPubkey($currentUser.pubkey) > 0) {
let votes = new Votes(Array.from($votes, ([_, v]) => v)); let votes = new Votes(Array.from($votes, ([_, v]) => v));
let result = votes.Results().Result(parsedRocket); result = votes.Results().Result(parsedRocket);
if (result && result == 'ratify' && !merit.IncludedInRocketState(parsedRocket)) { if (result && result == 'ratify' && !merit.IncludedInRocketState(parsedRocket)) {
if (
$currentUser &&
parsedRocket &&
parsedRocket.VotePowerForPubkey($currentUser.pubkey) > 0
) {
let e = parsedRocket.CreateUnsignedAMRProof(merit, votes); let e = parsedRocket.CreateUnsignedAMRProof(merit, votes);
if (e) { if (e) {
e.ndk = $ndk; e.ndk = $ndk;
@@ -68,6 +75,7 @@
} }
} }
} }
return events; return events;
}); });
@@ -76,9 +84,22 @@
console.log(c); console.log(c);
} }
}); });
let border = '';
let background = '';
$: {
if (result == 'blackball' && !merit.IncludedInRocketState(parsedRocket)) {
border = 'border-red-600';
background = 'bg-red-600';
}
if (merit.IncludedInRocketState(parsedRocket)) {
border = 'border-lime-600';
background = 'bg-lime-600';
}
}
</script> </script>
<Card.Root class="sm:col-span-2"> <Card.Root class="sm:col-span-2 {border}">
<Card.Header class="pb-3"> <Card.Header class="pb-3">
<div class="flex flex-nowrap justify-between"> <div class="flex flex-nowrap justify-between">
<Card.Title>Problem: {merit.Problem().substring(0, 20)}</Card.Title>{#if merit.Solution()}<a <Card.Title>Problem: {merit.Problem().substring(0, 20)}</Card.Title>{#if merit.Solution()}<a
@@ -178,8 +199,15 @@
</div></Card.Content </div></Card.Content
> >
</Card.Header> </Card.Header>
<Card.Footer class="flex flex-row items-center border-t px-6 py-3"> <Card.Footer class="flex flex-row justify-center border-t px-6 py-3 text-center {background}">
{#if merit.IncludedInRocketState(parsedRocket)}
<span class="scroll-m-20 text-lg font-semibold tracking-tight md:text-xl">APPROVED</span>
<!-- <Alert><div slot="title">Approved</div>This Merit Request has been approved!</Alert> -->
{:else if result == 'blackball'}
<span class="scroll-m-20 text-lg font-semibold tracking-tight md:text-xl">REJECTED</span>
{:else if !result}
<VoteOnMeritRequest {merit} rocket={new Rocket(rocket)} /> <VoteOnMeritRequest {merit} rocket={new Rocket(rocket)} />
{/if}
</Card.Footer> </Card.Footer>
</Card.Root> </Card.Root>

View File

@@ -9,6 +9,7 @@
import ProposedProducts from './ProposedProducts.svelte'; import ProposedProducts from './ProposedProducts.svelte';
import Todo from './Todo.svelte'; import Todo from './Todo.svelte';
import MeritRequests from './MeritRequests.svelte'; import MeritRequests from './MeritRequests.svelte';
import Button from '@/components/ui/button/button.svelte';
export let rocket: NDKEvent; export let rocket: NDKEvent;
</script> </script>
@@ -43,6 +44,7 @@
<Card.Description class="flex space-x-4"> <Card.Description class="flex space-x-4">
<CreateNewProduct rocketEvent={rocket} /> <CreateNewProduct rocketEvent={rocket} />
<CreateMeritRequest rocketEvent={rocket} /> <CreateMeritRequest rocketEvent={rocket} />
<Button on:click={()=>{console.log(rocket.rawEvent())}}>Print to Console</Button>
</Card.Description> </Card.Description>
</Card.Header> </Card.Header>
<Card.Footer></Card.Footer> <Card.Footer></Card.Footer>

View File

@@ -9,6 +9,8 @@ export class MeritRequest {
Pubkey: string; Pubkey: string;
TimeStamp: number; TimeStamp: number;
RocketTag: string | undefined; //31108:<pubkey>:<dtag> RocketTag: string | undefined; //31108:<pubkey>:<dtag>
LeadTime: number;
LastLTUpdate: number;
Problem(): string { Problem(): string {
let _problem = ''; let _problem = '';
//todo: handle 1971 problem tracker event tags somehow //todo: handle 1971 problem tracker event tags somehow
@@ -31,7 +33,8 @@ export class MeritRequest {
return _solution; return _solution;
} }
IncludedInRocketState(rocket: Rocket): boolean { IncludedInRocketState(rocket: Rocket): boolean {
return false; let included = rocket.ApprovedMeritRequests()
return Boolean(included.get(this.ID))
} }
BasicValidation(): boolean { BasicValidation(): boolean {
//todo: make a ValidateAgainstRocket and check that pubkey is in WoT //todo: make a ValidateAgainstRocket and check that pubkey is in WoT
@@ -62,7 +65,13 @@ export class MeritRequest {
kinds: [kind as number] kinds: [kind as number]
}; };
} }
constructor(request: NDKEvent) { constructor(request: NDKEvent | string) {
if (typeof request == 'string') {
console.log(69)
} else {
console.log(71)
this.LeadTime = 0;
this.LastLTUpdate = 0;
this.Event = request; this.Event = request;
this.ID = request.id; this.ID = request.id;
this.Pubkey = request.pubkey; this.Pubkey = request.pubkey;
@@ -82,6 +91,7 @@ export class MeritRequest {
this.Sats = getNumberFromTag('sats', request); this.Sats = getNumberFromTag('sats', request);
this.Merits = getNumberFromTag('merits', request); this.Merits = getNumberFromTag('merits', request);
} }
}
} }
export class Vote { export class Vote {
@@ -265,15 +275,14 @@ export class VoteTally {
export class MapOfVotes { export class MapOfVotes {
Votes: Map<string, Vote>; Votes: Map<string, Vote>;
constructor(votes:NDKEvent[], rocket:Rocket, merit:MeritRequest) { constructor(votes: NDKEvent[], rocket: Rocket, merit: MeritRequest) {
this.Votes = new Map<string, Vote>(); this.Votes = new Map<string, Vote>();
for (let v of votes) { for (let v of votes) {
let vote = new Vote(v); let vote = new Vote(v);
if ( if (
vote.BasicValidation() && vote.BasicValidation() &&
vote.ValidateAgainstRocket(rocket) && vote.ValidateAgainstRocket(rocket) &&
vote.ValidateAgainstMeritRequest(merit) && vote.ValidateAgainstMeritRequest(merit)
!merit.IncludedInRocketState(rocket)
) { ) {
this.Votes.set(vote.ID, vote); //only show the latest vote from each pubkey this.Votes.set(vote.ID, vote); //only show the latest vote from each pubkey
} }

View File

@@ -103,6 +103,11 @@ export class Rocket {
} }
return event; return event;
} }
// ApprovedMeritRequests():Map<string, MeritRequest> {
// let amr = new Map<string, MeritRequest>()
// return amr
// }
UpsertProduct(id: string, price: number, maxSales?: number): NDKEvent { UpsertProduct(id: string, price: number, maxSales?: number): NDKEvent {
let event = new NDKEvent(this.Event.ndk, this.Event.rawEvent()); let event = new NDKEvent(this.Event.ndk, this.Event.rawEvent());
event.created_at = Math.floor(new Date().getTime() / 1000); event.created_at = Math.floor(new Date().getTime() / 1000);