event filter

This commit is contained in:
tree🌴 2024-03-02 17:00:23 +01:00
parent 437fdf92fb
commit dc5b78b1ba
8 changed files with 623 additions and 436 deletions

View File

@ -31,13 +31,19 @@ const status = eventStatus(item)
</div> </div>
</div> </div>
<div class="flex gap-2"> <div class="flex gap-2">
<img src={`/flags/${item.country}.svg`} class="w-4" /> {item.type !== 'online-summit' &&
<div> <img src={`/flags/${item.country}.svg`} class="w-4" />
{item.city}, {item.country.toUpperCase()} <div>
{item.coincidence && {item.city}, {item.country.toUpperCase()}
<span>&nbsp;- {ccRenderer(item)}</span> {item.coincidence &&
} <span>&nbsp;- {ccRenderer(item)}</span>
</div> }
</div>
}
{item.type === 'online-summit' &&
<img src="/flags/other/earth.svg" class="w-4" />
<div>Online</div>
}
</div> </div>
</div> </div>
<div class="py-1 grow text-right items-center flex gap-4"> <div class="py-1 grow text-right items-center flex gap-4">

View File

@ -0,0 +1,129 @@
---
import BaseLayout from '../layouts/base.astro';
import core from '../core.json';
import EventItem from '../components/EventItem.astro';
import { isFuture } from 'date-fns';
import { types, countryNames } from '../lib/events.js';
const { type: selectedType } = Astro.props;
const { country: selectedCountry } = Astro.props;
let typeObj = selectedType ? types.find(t => t.id === selectedType) : null
let events = core.events;
if (selectedType) {
events = core.events.filter(ev => ev.type === selectedType)
}
if (selectedCountry) {
events = core.events.filter(ev => ev.country === selectedCountry)
}
function eventsFilter (year, future=true) {
return function (x) {
if (!x.date.match(new RegExp(`^${year}`))) {
return false
}
const isDate = x.date.match(/^\d{4}-\d{2}-\d{2}$/)
if (!isDate) {
return false
}
return future ? isFuture(new Date(x.date)) : !isFuture(new Date(x.date))
}
}
const currentYear = "2024";
const pastYears = [ 2023, 2024 ];
const upcoming = events.filter(x => x.date.match(/^2024/))
const past = {}
for (const year of pastYears.reverse()) {
past[year] = events.filter(eventsFilter(year, false)).reverse()
}
let places = [{ id: '', country: 'All countries', num: core.events.length }];
for (const ev of core.events) {
const found = places.find(p => p.country === ev.country)
if (found) {
found.num++;
continue;
}
if (!ev.country) {
continue;
}
places.push({
id: ev.country?.toLowerCase(),
country: ev.country,
num: 1,
})
}
places = places.sort((x, y) => x.num < y.num ? 1 : -1)
---
<BaseLayout title="Events" image="og_events">
<div class="middle-pane-medium mt-10">
<div class="mb-8 sm:mb-14">
<div class="flex flex-wrap gap-3 uppercase mb-4">
{types.map((type) => (
<a href={`/events/${type.id}`} class="px-2 py-0 border border-white/15 rounded-xl" class:list={[ (type.id === selectedType) || (!type.id && !selectedType)? 'text-black bg-white' : 'hover:bg-white/20']}>{type.plural} ({type.id ? core.events.filter(obj => obj.type === type.id).length : core.events.length})</a>
))}
</div>
<div class="flex flex-wrap gap-2 uppercase text-sm">
{places.map((place) => (
<a href={place.id ? `/events/country/${place.id}` : `/events`} class="px-2 py-0.5 border border-white/15 rounded-xl flex gap-2" class:list={[ (place.id === selectedCountry) || (!place.id && !selectedCountry)? 'text-black bg-white' : 'hover:bg-white/20']}>
{place.id &&
<img src={`/flags/${place.country}.svg`} class="w-4 inline-block" />
}
{countryNames[place.country] || place.country} ({place.num})
</a>
))}
</div>
</div>
<!--div class="mb-10">
<img src="/events-map.svg" class="w-full" />
</div-->
<h1 id="upcoming">Upcoming {selectedType ? ` ${typeObj.plural} ` : ''}({upcoming.length})</h1>
<div class="mb-10">
{upcoming.map((event) => (
<EventItem item={event} />
))}
</div>
<h1 id="past">Past {selectedType ? ` ${typeObj.plural} ` : ''}({events.length-upcoming.length})</h1>
{pastYears.map((year) => (
past[year].length > 0 &&
<h2>{year} ({past[year].length})</h2>
<div class="mt-4 mb-10">
{past[year]?.map((event) => (
<EventItem item={event} />
))}
</div>
))}
<p>
<a href="https://github.com/web3privacy/data/tree/main/src/events" class="hover:underline">Source repository</a>
</p>
</div>
<script is:inline>
document.querySelectorAll('.event-header .header-base').forEach((el) => {
el.addEventListener('click', (ev) => {
if (ev.target.tagName === "BUTTON") {
return false;
}
if (ev.target.tagName === "A") {
return false;
}
const detail = el.parentElement.parentElement.querySelector('.detail')
document.querySelectorAll('.detail:not(.hidden)').forEach(e => (detail !== e ? e.classList.add('hidden') : null));
detail.classList.toggle('hidden');
});
});
</script>
</BaseLayout>

View File

@ -135,136 +135,10 @@
], ],
"people": [ "people": [
{ {
"id": "coinmandeer", "id": "andrea-togni",
"name": "Coinmandeer", "name": "Andrea Togni",
"refs": { "caption": "Philosopher, Monero policy workgroup",
"twitter": "KeenOfCoin", "imageUrl": "https://data.web3privacy.info/img/people/andrea-togni.jpg"
"github": "coinmandeer"
},
"imageUrl": "https://data.web3privacy.info/img/people/coinmandeer.png"
},
{
"id": "jaromil",
"name": "Denis Roio",
"nickname": "Jaromil",
"caption": "Founder of [Dyne.org](https://dyne.org/)",
"refs": {
"twitter": "jaromil"
},
"imageUrl": "https://data.web3privacy.info/img/people/jaromil.jpeg"
},
{
"id": "vaclav-pavlin",
"name": "Václav Pavlín",
"caption": "Core contributor @ [Status](https://status.app/), [Logos](https://logos.co/about), [Waku](https://waku.org/)",
"country": "cz",
"refs": {
"twitter": "vpavlin"
},
"imageUrl": "https://data.web3privacy.info/img/people/vaclav-pavlin.jpeg"
},
{
"id": "max-hampshire",
"name": "Max Hampshire",
"caption": "Senior devrel of [Nym](https://nymtech.net/), Co-founder of [terra0](https://terra0.org/)",
"country": "at",
"refs": {
"twitter": "_wjth"
},
"imageUrl": "https://data.web3privacy.info/img/people/max-hampshire.jpg"
},
{
"id": "alex-kampa",
"name": "Alex Kampa",
"caption": "Director at [Aragon ZK Research](https://research.aragon.org/)",
"country": "lu",
"refs": {
"linkedin": "alex-kampa"
},
"imageUrl": "https://data.web3privacy.info/img/people/alex-kampa.jpg"
},
{
"id": "dcbuilder",
"name": "dcbuilder.eth",
"caption": "Research engineer at [Worldcoin](https://worldcoin.org/), ZKML & Rust enthusiast",
"country": "cz",
"refs": {
"twitter": "DCbuild3r"
},
"imageUrl": "https://data.web3privacy.info/img/people/dcbuilder.jpg"
},
{
"id": "tree",
"name": "Tree",
"caption": "Orchestrating lunarpunk events [ETHBrno](https://ethbrno.cz) & [w3ps](https://github.com/web3privacy/w3ps) w/ [gwei.cz](https://gwei.cz)",
"country": "cz",
"refs": {
"bsky": "tree.fail"
},
"imageUrl": "https://data.web3privacy.info/img/people/tree.jpg"
},
{
"id": "guy-zyskind",
"name": "Guy Zyskind",
"caption": "Founder of [Secret Network](https://scrt.network/), CEO [SCRT Labs](https://www.scrtlabs.com/)",
"country": "is",
"refs": {
"twitter": "GuyZys"
},
"imageUrl": "https://data.web3privacy.info/img/people/guy-zyskind.jpg"
},
{
"id": "marcel-kolaja",
"name": "Marcel Kolaja",
"caption": "Member of the European Parliament",
"country": "cz",
"refs": {
"twitter": "PiratKolaja"
},
"imageUrl": "https://data.web3privacy.info/img/people/marcel-kolaja.jpeg"
},
{
"id": "oliver-gale",
"name": "Oliver Gale",
"caption": "CEO of [Panther Protocol](https://www.pantherprotocol.io/)",
"refs": {
"twitter": "OriginalOlii"
},
"imageUrl": "https://data.web3privacy.info/img/people/oliver-gale.jpeg"
},
{
"id": "gabari",
"name": "Bryce",
"nickname": "gabari",
"caption": "[Brume Wallet](https://brume.money/) co-founder & [MangroveDAO](https://mangrovedao.earth/) Core",
"refs": {
"twitter": "bryce_gabari"
},
"imageUrl": "https://data.web3privacy.info/img/people/gabari.jpeg"
},
{
"id": "merula",
"name": "Merula",
"caption": "Software engineer and cryptographer Circles Entropy",
"imageUrl": "https://data.web3privacy.info/img/people/merula.jpeg"
},
{
"id": "wslyvh",
"name": "Wesley",
"caption": "Events @ Ethereum 🛠️ Indie Maker",
"refs": {
"twitter": "wslyvh"
},
"imageUrl": "https://data.web3privacy.info/img/people/wslyvh.png"
},
{
"id": "steffen-kux",
"name": "Steffen Kux",
"caption": "CEO dm3",
"refs": {
"twitter": "SteffenKux"
},
"imageUrl": "https://data.web3privacy.info/img/people/steffen-kux.jpeg"
}, },
{ {
"id": "vincenzo-iovino", "id": "vincenzo-iovino",
@ -276,6 +150,224 @@
}, },
"imageUrl": "https://data.web3privacy.info/img/people/vincenzo-iovino.jpg" "imageUrl": "https://data.web3privacy.info/img/people/vincenzo-iovino.jpg"
}, },
{
"id": "pg",
"name": "PG",
"caption": "Organizing [ETHRome](https://ethrome.org) w/ [urbe.eth](https://linktr.ee/urbe.eth), making sauce w/ [SpaghettETH](https://linktr.ee/spaghetteth)",
"country": "it",
"refs": {
"twitter": "PG_CDG"
},
"imageUrl": "https://data.web3privacy.info/img/people/pg.jpg"
},
{
"id": "carlo-chialastri",
"name": "Carlo Avv. Chialastri",
"caption": "Urbe.eth lawyer",
"country": "it",
"refs": {
"linkedin": "carlo-avv-chialastri-8456a544"
},
"imageUrl": "https://data.web3privacy.info/img/people/carlo-chialastri.jpeg"
},
{
"id": "limone-eth",
"name": "limone.eth",
"caption": "Serial hacker and community builder | core [urbeEth](https://twitter.com/urbeeth) & [ETHRome](https://www.ethrome.org/)",
"country": "it",
"refs": {
"twitter": "limone_eth"
},
"imageUrl": "https://data.web3privacy.info/img/people/limone-eth.jpeg"
},
{
"id": "tim-bansemer",
"name": "Tim Bansemer",
"caption": "[Aqua Protocol](https://aqua-protocol.org/)",
"refs": {
"twitter": "tim_bansemer"
},
"imageUrl": "https://data.web3privacy.info/img/people/tim-bansemer.jpeg"
},
{
"id": "steffen-kux",
"name": "Steffen Kux",
"caption": "CEO dm3",
"refs": {
"twitter": "SteffenKux"
},
"imageUrl": "https://data.web3privacy.info/img/people/steffen-kux.jpeg"
},
{
"id": "nick-almond",
"name": "Nick Almond",
"caption": "Building next generation DAOs with [FactoryDAO](https://www.factorydao.xyz/)",
"country": "gb",
"refs": {
"twitter": "DrNickA"
},
"imageUrl": "https://data.web3privacy.info/img/people/nick-almond.jpg"
},
{
"id": "radek-svarz",
"name": "Radek Švarz",
"country": "cz",
"caption": "Visionary, architect, connecting business and IT",
"refs": {
"twitter": "radk"
},
"imageUrl": "https://data.web3privacy.info/img/people/radek-svarz.webp"
},
{
"id": "eleanore-blanc",
"name": "Eléonore Blanc",
"caption": "Crypto Educator & Founder of [CryptoCanal](https://www.cryptocanal.org/), [ETHDam](https://www.ethdam.com/) organiser",
"country": "nl",
"refs": {
"twitter": "blockblanc"
},
"imageUrl": "https://data.web3privacy.info/img/people/eleanore-blanc.jpeg"
},
{
"id": "oliver-gale",
"name": "Oliver Gale",
"caption": "CEO of [Panther Protocol](https://www.pantherprotocol.io/)",
"refs": {
"twitter": "OriginalOlii"
},
"imageUrl": "https://data.web3privacy.info/img/people/oliver-gale.jpeg"
},
{
"id": "vaclav-pavlin",
"name": "Václav Pavlín",
"caption": "Core contributor @ [Status](https://status.app/), [Logos](https://logos.co/about), [Waku](https://waku.org/)",
"country": "cz",
"refs": {
"twitter": "vpavlin"
},
"imageUrl": "https://data.web3privacy.info/img/people/vaclav-pavlin.jpeg"
},
{
"id": "alan-scott",
"name": "Alan Scott",
"caption": "Co-founder of [Railgun](https://www.railgun.org/)",
"country": "us",
"refs": {
"twitter": "tsu_kareta"
},
"imageUrl": "https://data.web3privacy.info/img/people/alan-scott.jpeg"
},
{
"id": "alex-zaidelson",
"name": "Alex Zaidelson",
"caption": "CEO [SCRT Labs](https://www.scrtlabs.com/)",
"refs": {
"twitter": "azaidelson"
},
"imageUrl": "https://data.web3privacy.info/img/people/alex-zaidelson.jpeg"
},
{
"id": "merula",
"name": "Merula",
"caption": "Software engineer and cryptographer Circles Entropy",
"imageUrl": "https://data.web3privacy.info/img/people/merula.jpeg"
},
{
"id": "jaromil",
"name": "Denis Roio",
"nickname": "Jaromil",
"caption": "Founder of [Dyne.org](https://dyne.org/)",
"refs": {
"twitter": "jaromil"
},
"imageUrl": "https://data.web3privacy.info/img/people/jaromil.jpeg"
},
{
"id": "antoni-zolciak",
"name": "Antoni Zolciak",
"caption": "Co-founder of [Aleph Zero](https://alephzero.org/) & [Cardinal](https://cardinal.co/)",
"country": "pl",
"refs": {
"twitter": "AntoniZolciak"
},
"imageUrl": "https://data.web3privacy.info/img/people/antoni-zolciak.jpg"
},
{
"id": "coinmandeer",
"name": "Coinmandeer",
"refs": {
"twitter": "KeenOfCoin",
"github": "coinmandeer"
},
"imageUrl": "https://data.web3privacy.info/img/people/coinmandeer.png"
},
{
"id": "guy-zyskind",
"name": "Guy Zyskind",
"caption": "Founder of [Secret Network](https://scrt.network/), CEO [SCRT Labs](https://www.scrtlabs.com/)",
"country": "is",
"refs": {
"twitter": "GuyZys"
},
"imageUrl": "https://data.web3privacy.info/img/people/guy-zyskind.jpg"
},
{
"id": "r-prokh",
"name": "Roma",
"nickname": "r_prokh",
"caption": "Growth Lead @ [Questbook](https://questbook.app/)",
"country": "pt",
"refs": {
"twitter": "r_prokh"
},
"imageUrl": "https://data.web3privacy.info/img/people/r-prokh.jpeg"
},
{
"id": "tibor-csoka",
"name": "Tibor Csóka",
"caption": "Software Engineer at [HOPR](https://hoprnet.org/)",
"imageUrl": "https://data.web3privacy.info/img/people/tibor-csoka.jpg"
},
{
"id": "catsnaks",
"name": "Catsnaks",
"caption": "[PSE](https://pse.dev/)"
},
{
"id": "serinko",
"name": "Serinko",
"caption": "Privacy Researcher",
"refs": {
"twitter": "serinko13"
},
"imageUrl": "https://data.web3privacy.info/img/people/serinko.jpeg"
},
{
"id": "marcel-kolaja",
"name": "Marcel Kolaja",
"caption": "Member of the European Parliament",
"country": "cz",
"refs": {
"twitter": "PiratKolaja"
},
"imageUrl": "https://data.web3privacy.info/img/people/marcel-kolaja.jpeg"
},
{
"id": "althea",
"name": "Althea",
"caption": "Head of Comms, Privacy & Scaling Exploration",
"imageUrl": "https://data.web3privacy.info/img/people/althea.jpeg"
},
{
"id": "dcbuilder",
"name": "dcbuilder.eth",
"caption": "Research engineer at [Worldcoin](https://worldcoin.org/), ZKML & Rust enthusiast",
"country": "cz",
"refs": {
"twitter": "DCbuild3r"
},
"imageUrl": "https://data.web3privacy.info/img/people/dcbuilder.jpg"
},
{ {
"id": "mario-havel", "id": "mario-havel",
"name": "Mario Havel", "name": "Mario Havel",
@ -286,6 +378,25 @@
}, },
"imageUrl": "https://data.web3privacy.info/img/people/mario-havel.jpg" "imageUrl": "https://data.web3privacy.info/img/people/mario-havel.jpg"
}, },
{
"id": "kieran-mesquita",
"name": "Kieran Mesquita",
"caption": "Chief scientist [Railgun DAO](https://www.railgun.org/)",
"refs": {
"twitter": "mesquka"
},
"imageUrl": "https://data.web3privacy.info/img/people/kieran-mesquita.jpeg"
},
{
"id": "manu-alzuru",
"name": "Manu Alzuru",
"caption": "Humanist, solarpunk, Founder of [DoinGud](https://doingud.com/) & [ETH Barcelona](https://ethbarcelona.com/)",
"country": "es",
"refs": {
"twitter": "ManuAlzuru"
},
"imageUrl": "https://data.web3privacy.info/img/people/manu-alzuru.jpg"
},
{ {
"id": "ameen-soleimani", "id": "ameen-soleimani",
"name": "Ameen Soleimani", "name": "Ameen Soleimani",
@ -296,6 +407,114 @@
}, },
"imageUrl": "https://data.web3privacy.info/img/people/ameen-soleimani.jpg" "imageUrl": "https://data.web3privacy.info/img/people/ameen-soleimani.jpg"
}, },
{
"id": "alona-shevchenko",
"name": "Alona Shevchenko",
"caption": "Unapologetic Ukrainian behind [Ukraine DAO](https://ukrainedao.love/) & [Kyiv Tech Summit](https://www.kyivtechsummit.com/)",
"country": "ua",
"refs": {
"twitter": "cryptodrftng"
},
"imageUrl": "https://data.web3privacy.info/img/people/alona-shevchenko.jpg"
},
{
"id": "wslyvh",
"name": "Wesley",
"caption": "Events @ Ethereum 🛠️ Indie Maker",
"refs": {
"twitter": "wslyvh"
},
"imageUrl": "https://data.web3privacy.info/img/people/wslyvh.png"
},
{
"id": "juraj-bednar",
"name": "Juraj Bednar",
"caption": "Educator, writer, cryptoanarchist & biohacker ([blog](https://juraj.bednar.io/))",
"country": "sk",
"refs": {
"twitter": "jurbed"
},
"imageUrl": "https://data.web3privacy.info/img/people/juraj-bednar.jpg"
},
{
"id": "alex-kampa",
"name": "Alex Kampa",
"caption": "Director at [Aragon ZK Research](https://research.aragon.org/)",
"country": "lu",
"refs": {
"linkedin": "alex-kampa"
},
"imageUrl": "https://data.web3privacy.info/img/people/alex-kampa.jpg"
},
{
"id": "tree",
"name": "Tree",
"caption": "Orchestrating lunarpunk events [ETHBrno](https://ethbrno.cz) & [w3ps](https://github.com/web3privacy/w3ps) w/ [gwei.cz](https://gwei.cz)",
"country": "cz",
"refs": {
"bsky": "tree.fail"
},
"imageUrl": "https://data.web3privacy.info/img/people/tree.jpg"
},
{
"id": "edward-fricker",
"name": "Edward P. Fricker",
"caption": "right to privacy foundation, deficon, railgun dao, lobsterdao",
"refs": {
"twitter": "itsthefuture"
},
"imageUrl": "https://data.web3privacy.info/img/people/edward-fricker.jpg"
},
{
"id": "rik-krieger",
"name": "Rik Krieger",
"nickname": "rikzrh",
"caption": "Co-founder of [HOPR](https://hoprnet.org/)",
"country": "ch",
"refs": {
"twitter": "rikzrh"
},
"imageUrl": "https://data.web3privacy.info/img/people/rik-krieger.jpg"
},
{
"id": "rachel-rose-oleary",
"name": "Rachel-Rose O'Leary",
"caption": "[DarkFi](https://dark.fi/) core dev, writer",
"refs": {
"twitter": "lunar_mining"
},
"imageUrl": "https://data.web3privacy.info/img/people/rachel-rose-oleary.jpg"
},
{
"id": "gabari",
"name": "Bryce",
"nickname": "gabari",
"caption": "[Brume Wallet](https://brume.money/) co-founder & [MangroveDAO](https://mangrovedao.earth/) Core",
"refs": {
"twitter": "bryce_gabari"
},
"imageUrl": "https://data.web3privacy.info/img/people/gabari.jpeg"
},
{
"id": "joshua-davila",
"name": "Joshua Davila",
"caption": "Blog & podcast \"[The Blockchain Socialist](https://linktr.ee/theblockchainsocialist)\"",
"refs": {
"twitter": "TBSocialist",
"bsky": "tbsocialist.bsky.social"
},
"imageUrl": "https://data.web3privacy.info/img/people/joshua-davila.jpg"
},
{
"id": "costanza-gallo",
"name": "Costanza Gallo",
"caption": "Head of partnerships at the [The Swarm Foundation](https://www.ethswarm.org/foundation)",
"country": "it",
"refs": {
"twitter": "costgallo"
},
"imageUrl": "https://data.web3privacy.info/img/people/costanza-gallo.jpeg"
},
{ {
"id": "afri-schoedon", "id": "afri-schoedon",
"name": "Afri Schoedon", "name": "Afri Schoedon",
@ -318,185 +537,14 @@
"imageUrl": "https://data.web3privacy.info/img/people/pavol-luptak.jpeg" "imageUrl": "https://data.web3privacy.info/img/people/pavol-luptak.jpeg"
}, },
{ {
"id": "andrea-togni", "id": "max-hampshire",
"name": "Andrea Togni", "name": "Max Hampshire",
"caption": "Philosopher, Monero policy workgroup", "caption": "Senior devrel of [Nym](https://nymtech.net/), Co-founder of [terra0](https://terra0.org/)",
"imageUrl": "https://data.web3privacy.info/img/people/andrea-togni.jpg" "country": "at",
},
{
"id": "alona-shevchenko",
"name": "Alona Shevchenko",
"caption": "Unapologetic Ukrainian behind [Ukraine DAO](https://ukrainedao.love/) & [Kyiv Tech Summit](https://www.kyivtechsummit.com/)",
"country": "ua",
"refs": { "refs": {
"twitter": "cryptodrftng" "twitter": "_wjth"
}, },
"imageUrl": "https://data.web3privacy.info/img/people/alona-shevchenko.jpg" "imageUrl": "https://data.web3privacy.info/img/people/max-hampshire.jpg"
},
{
"id": "antoni-zolciak",
"name": "Antoni Zolciak",
"caption": "Co-founder of [Aleph Zero](https://alephzero.org/) & [Cardinal](https://cardinal.co/)",
"country": "pl",
"refs": {
"twitter": "AntoniZolciak"
},
"imageUrl": "https://data.web3privacy.info/img/people/antoni-zolciak.jpg"
},
{
"id": "serinko",
"name": "Serinko",
"caption": "Privacy Researcher",
"refs": {
"twitter": "serinko13"
},
"imageUrl": "https://data.web3privacy.info/img/people/serinko.jpeg"
},
{
"id": "carlo-chialastri",
"name": "Carlo Avv. Chialastri",
"caption": "Urbe.eth lawyer",
"country": "it",
"refs": {
"linkedin": "carlo-avv-chialastri-8456a544"
},
"imageUrl": "https://data.web3privacy.info/img/people/carlo-chialastri.jpeg"
},
{
"id": "manu-alzuru",
"name": "Manu Alzuru",
"caption": "Humanist, solarpunk, Founder of [DoinGud](https://doingud.com/) & [ETH Barcelona](https://ethbarcelona.com/)",
"country": "es",
"refs": {
"twitter": "ManuAlzuru"
},
"imageUrl": "https://data.web3privacy.info/img/people/manu-alzuru.jpg"
},
{
"id": "nick-almond",
"name": "Nick Almond",
"caption": "Building next generation DAOs with [FactoryDAO](https://www.factorydao.xyz/)",
"country": "gb",
"refs": {
"twitter": "DrNickA"
},
"imageUrl": "https://data.web3privacy.info/img/people/nick-almond.jpg"
},
{
"id": "costanza-gallo",
"name": "Costanza Gallo",
"caption": "Head of partnerships at the [The Swarm Foundation](https://www.ethswarm.org/foundation)",
"country": "it",
"refs": {
"twitter": "costgallo"
},
"imageUrl": "https://data.web3privacy.info/img/people/costanza-gallo.jpeg"
},
{
"id": "rachel-rose-oleary",
"name": "Rachel-Rose O'Leary",
"caption": "[DarkFi](https://dark.fi/) core dev, writer",
"refs": {
"twitter": "lunar_mining"
},
"imageUrl": "https://data.web3privacy.info/img/people/rachel-rose-oleary.jpg"
},
{
"id": "r-prokh",
"name": "Roma",
"nickname": "r_prokh",
"caption": "Growth Lead @ [Questbook](https://questbook.app/)",
"country": "pt",
"refs": {
"twitter": "r_prokh"
},
"imageUrl": "https://data.web3privacy.info/img/people/r-prokh.jpeg"
},
{
"id": "rik-krieger",
"name": "Rik Krieger",
"nickname": "rikzrh",
"caption": "Co-founder of [HOPR](https://hoprnet.org/)",
"country": "ch",
"refs": {
"twitter": "rikzrh"
},
"imageUrl": "https://data.web3privacy.info/img/people/rik-krieger.jpg"
},
{
"id": "pg",
"name": "PG",
"caption": "Organizing [ETHRome](https://ethrome.org) w/ [urbe.eth](https://linktr.ee/urbe.eth), making sauce w/ [SpaghettETH](https://linktr.ee/spaghetteth)",
"country": "it",
"refs": {
"twitter": "PG_CDG"
},
"imageUrl": "https://data.web3privacy.info/img/people/pg.jpg"
},
{
"id": "althea",
"name": "Althea",
"caption": "Head of Comms, Privacy & Scaling Exploration",
"imageUrl": "https://data.web3privacy.info/img/people/althea.jpeg"
},
{
"id": "tim-bansemer",
"name": "Tim Bansemer",
"caption": "[Aqua Protocol](https://aqua-protocol.org/)",
"refs": {
"twitter": "https://twitter.com/tim_bansemer"
},
"imageUrl": "https://data.web3privacy.info/img/people/tim-bansemer.jpeg"
},
{
"id": "catsnaks",
"name": "Catsnaks",
"caption": "[PSE](https://pse.dev/)"
},
{
"id": "mykola-siusko",
"name": "Mykola Siusko",
"caption": "Web3 privacy advocate behind [Web3Privacy Now](https://web3privacy.info/)",
"country": "es",
"refs": {
"twitter": "nicksvyaznoy"
},
"imageUrl": "https://data.web3privacy.info/img/people/mykola-siusko.png"
},
{
"id": "tibor-csoka",
"name": "Tibor Csóka",
"caption": "Software Engineer at [HOPR](https://hoprnet.org/)",
"imageUrl": "https://data.web3privacy.info/img/people/tibor-csoka.jpg"
},
{
"id": "radek-svarz",
"name": "Radek Švarz",
"country": "cz",
"caption": "Visionary, architect, connecting business and IT",
"refs": {
"twitter": "radk"
},
"imageUrl": "https://data.web3privacy.info/img/people/radek-svarz.webp"
},
{
"id": "juraj-bednar",
"name": "Juraj Bednar",
"caption": "Educator, writer, cryptoanarchist & biohacker ([blog](https://juraj.bednar.io/))",
"country": "sk",
"refs": {
"twitter": "jurbed"
},
"imageUrl": "https://data.web3privacy.info/img/people/juraj-bednar.jpg"
},
{
"id": "alex-zaidelson",
"name": "Alex Zaidelson",
"caption": "CEO [SCRT Labs](https://www.scrtlabs.com/)",
"refs": {
"twitter": "azaidelson"
},
"imageUrl": "https://data.web3privacy.info/img/people/alex-zaidelson.jpeg"
}, },
{ {
"id": "odysseas", "id": "odysseas",
@ -508,43 +556,14 @@
"imageUrl": "https://data.web3privacy.info/img/people/odysseas.jpeg" "imageUrl": "https://data.web3privacy.info/img/people/odysseas.jpeg"
}, },
{ {
"id": "limone-eth", "id": "mykola-siusko",
"name": "limone.eth", "name": "Mykola Siusko",
"caption": "Serial hacker and community builder | core [urbeEth](https://twitter.com/urbeeth) & [ETHRome](https://www.ethrome.org/)", "caption": "Web3 privacy advocate behind [Web3Privacy Now](https://web3privacy.info/)",
"country": "it", "country": "es",
"refs": { "refs": {
"twitter": "limone_eth" "twitter": "nicksvyaznoy"
}, },
"imageUrl": "https://data.web3privacy.info/img/people/limone-eth.jpeg" "imageUrl": "https://data.web3privacy.info/img/people/mykola-siusko.png"
},
{
"id": "alan-scott",
"name": "Alan Scott",
"caption": "Co-founder of [Railgun](https://www.railgun.org/)",
"country": "us",
"refs": {
"twitter": "tsu_kareta"
},
"imageUrl": "https://data.web3privacy.info/img/people/alan-scott.jpeg"
},
{
"id": "eleanore-blanc",
"name": "Eléonore Blanc",
"caption": "Crypto Educator & Founder of [CryptoCanal](https://www.cryptocanal.org/), [ETHDam](https://www.ethdam.com/) organiser",
"country": "nl",
"refs": {
"twitter": "blockblanc"
},
"imageUrl": "https://data.web3privacy.info/img/people/eleanore-blanc.jpeg"
},
{
"id": "kieran-mesquita",
"name": "Kieran Mesquita",
"caption": "Chief scientist [Railgun DAO](https://www.railgun.org/)",
"refs": {
"twitter": "mesquka"
},
"imageUrl": "https://data.web3privacy.info/img/people/kieran-mesquita.jpeg"
} }
], ],
"events": [ "events": [
@ -758,7 +777,8 @@
"ligi" "ligi"
], ],
"speakers": [ "speakers": [
"afri-schoedon" "afri-schoedon",
"joshua-davila"
], ],
"slots": 3, "slots": 3,
"links": { "links": {
@ -787,6 +807,7 @@
"speakers": [ "speakers": [
"pavol-luptak", "pavol-luptak",
"gabari", "gabari",
"radek-svarz",
"mykola-siusko" "mykola-siusko"
] ]
}, },
@ -839,9 +860,18 @@
"rsvp": "https://lu.ma/w3pn-meetup-ljubljana1" "rsvp": "https://lu.ma/w3pn-meetup-ljubljana1"
}, },
"speakers": [ "speakers": [
"joshua-davila",
"mykola-siusko" "mykola-siusko"
] ]
}, },
{
"id": "os24q2",
"type": "online-summit",
"name-extension": "Q2",
"date": "2024-06-23",
"lead": "Tree",
"slots": 8
},
{ {
"id": "m24bcn", "id": "m24bcn",
"issue": 20, "issue": 20,
@ -851,7 +881,10 @@
"country": "es", "country": "es",
"coincidence": "ETHBarcelona", "coincidence": "ETHBarcelona",
"slots": 3, "slots": 3,
"optional": true "optional": true,
"speakers": [
"joshua-davila"
]
}, },
{ {
"id": "m24bru", "id": "m24bru",
@ -870,6 +903,8 @@
"rsvp": "https://lu.ma/w3pn-meetup-bru1" "rsvp": "https://lu.ma/w3pn-meetup-bru1"
}, },
"speakers": [ "speakers": [
"edward-fricker",
"joshua-davila",
"mykola-siusko" "mykola-siusko"
] ]
}, },
@ -885,6 +920,14 @@
"slots": 3, "slots": 3,
"optional": true "optional": true
}, },
{
"id": "os24q3",
"type": "online-summit",
"name-extension": "Q3",
"date": "2024/Sep",
"lead": "Tree",
"slots": 8
},
{ {
"id": "m24cph", "id": "m24cph",
"issue": 18, "issue": 18,
@ -957,6 +1000,7 @@
}, },
"speakers": [ "speakers": [
"juraj-bednar", "juraj-bednar",
"radek-svarz",
"mykola-siusko", "mykola-siusko",
"pg", "pg",
"tree" "tree"
@ -985,7 +1029,18 @@
"slots": 5, "slots": 5,
"links": { "links": {
"rsvp": "https://lu.ma/w3pn-meetup-devcon7" "rsvp": "https://lu.ma/w3pn-meetup-devcon7"
} },
"speakers": [
"edward-fricker"
]
},
{
"id": "os24q4",
"type": "online-summit",
"name-extension": "Q4",
"date": "2024/Dec",
"lead": "Tree",
"slots": 8
} }
] ]
} }

View File

@ -1,5 +1,30 @@
import { format, compareAsc, addDays, isFuture } from 'date-fns'; import { format, compareAsc, addDays, isFuture } from 'date-fns';
export const types = [
{ id: "", plural: 'All events'},
{ id: "meetup", name: 'Meetup', plural: 'Meetups' },
{ id: "summit", name: 'Summit', plural: 'Summits' },
{ id: "privacy-corner", name: 'Privacy Corner', plural: 'Privacy Corners' },
{ id: "online-summit", name: 'Online Summit', plural: 'Online Summits' },
]
export const countryNames = {
cz: 'Czechia',
it: 'Italy',
de: 'Germany',
es: 'Spain',
si: 'Slovenia',
dk: 'Denmark',
pl: 'Poland',
be: 'Belgium',
pt: 'Portugal',
ee: 'Estonia',
nl: 'Netherlands',
ro: 'Romania',
gr: 'Greece',
th: 'Thailand',
}
export function dateInfo (item) { export function dateInfo (item) {
const isDate = item.date.match(/^\d{4}-\d{2}-\d{2}$/) const isDate = item.date.match(/^\d{4}-\d{2}-\d{2}$/)
const future = isDate && !isFuture(new Date(item.date)); const future = isDate && !isFuture(new Date(item.date));
@ -45,6 +70,9 @@ export function nameRenderer (item, full = false) {
case 'privacy-corner': case 'privacy-corner':
return `Privacy Corner at `+ (item.coincidenceFull ? item.coincidenceFull : `${item.coincidence} ${date.year}`) return `Privacy Corner at `+ (item.coincidenceFull ? item.coincidenceFull : `${item.coincidence} ${date.year}`)
break; break;
case 'online-summit':
return "ONLINE Summit" + (item['name-extension'] ? ' ' + item['name-extension'] : '') + (full ? ` ${date.year}` : '');
break;
} }
} }

View File

@ -30,13 +30,19 @@ const ext = findExt(EventsExt, item)
<h1 id="upcoming">W3PN {nameRenderer(item, true)}</h1> <h1 id="upcoming">W3PN {nameRenderer(item, true)}</h1>
<div class="flex gap-2 mb-4 text-lg"> <div class="flex gap-2 mb-4 text-lg">
<img src={`/flags/${item.country}.svg`} class="w-4" /> {item.type !== 'online-summit' &&
<div> <img src={`/flags/${item.country}.svg`} class="w-4" />
{item.city}, {item.country.toUpperCase()} <div>
{item.coincidence && {item.city}, {item.country.toUpperCase()}
<span>&nbsp;- {ccRenderer(item)}</span> {item.coincidence &&
} <span>&nbsp;- {ccRenderer(item)}</span>
</div> }
</div>
}
{item.type === 'online-summit' &&
<img src="/flags/other/earth.svg" class="w-4" />
<div>Online</div>
}
</div> </div>
<div> <div>

View File

@ -1,82 +1,7 @@
--- ---
import BaseLayout from '../layouts/base.astro'; import EventsPage from '../components/EventsPage.astro';
import core from '../core.json';
import EventItem from '../components/EventItem.astro';
import { isFuture } from 'date-fns';
const events = core.events;
function eventsFilter (year, future=true) {
return function (x) {
if (!x.date.match(new RegExp(`^${year}`))) {
return false
}
const isDate = x.date.match(/^\d{4}-\d{2}-\d{2}$/)
if (!isDate) {
return false
}
return future ? isFuture(new Date(x.date)) : !isFuture(new Date(x.date))
}
}
const currentYear = "2024";
const pastYears = [ 2023, 2024 ];
const upcoming = events.filter(x => x.date.match(/^2024/))
const past = {}
for (const year of pastYears.reverse()) {
past[year] = events.filter(eventsFilter(year, false)).reverse()
}
--- ---
<BaseLayout title="Events" image="og_events"> <EventsPage />
<div class="middle-pane-medium mt-10">
<!--div class="mb-10">
<img src="/events-map.svg" class="w-full" />
</div-->
<h1 id="upcoming">Upcoming ({upcoming.length})</h1>
<div class="mb-10">
{upcoming.map((event) => (
<EventItem item={event} />
))}
</div>
<h1 id="past">Past events ({events.length-upcoming.length})</h1>
{pastYears.map((year) => (
past[year].length > 0 &&
<h2>{year} ({past[year].length})</h2>
<div class="mt-4 mb-10">
{past[year]?.map((event) => (
<EventItem item={event} />
))}
</div>
))}
<p>
<a href="https://github.com/web3privacy/data/tree/main/src/events" class="hover:underline">Source repository</a>
</p>
</div>
<script is:inline>
document.querySelectorAll('.event-header .header-base').forEach((el) => {
el.addEventListener('click', (ev) => {
if (ev.target.tagName === "BUTTON") {
return false;
}
if (ev.target.tagName === "A") {
return false;
}
const detail = el.parentElement.parentElement.querySelector('.detail')
document.querySelectorAll('.detail:not(.hidden)').forEach(e => (detail !== e ? e.classList.add('hidden') : null));
detail.classList.toggle('hidden');
});
});
</script>
</BaseLayout>

View File

@ -0,0 +1,14 @@
---
import EventsPage from '../../components/EventsPage.astro';
import { types } from '../../lib/events.js';
const { type } = Astro.params;
export async function getStaticPaths() {
return types.filter(obj => obj.id).map(obj => ({ params: { type: obj.id }}));
}
---
<EventsPage {type} />

View File

@ -0,0 +1,24 @@
---
import EventsPage from '../../../components/EventsPage.astro';
import { types } from '../../../lib/events.js';
import core from '../../../core.json';
const { country } = Astro.params;
export async function getStaticPaths() {
const countries = []
for (const ev of core.events) {
if (!ev.country) {
continue
}
if (!countries.includes(ev.country)) {
countries.push(ev.country)
}
}
return countries.map(country => ({ params: { country }}));
}
---
<EventsPage {country} />