Skip to content

Commit 195b9f8

Browse files
committed
downloading speakers data from Airtable, linking to 2021 images
1 parent a64b43e commit 195b9f8

File tree

5 files changed

+73
-2
lines changed

5 files changed

+73
-2
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ data/production
44
public/static.json
55
src/shared/static.json
66
.arc-env
7+
.env
78

89
# Logs
910
logs

package-lock.json

+17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212
"@architect/architect": "^8.7.4",
1313
"@architect/sandbox": "^3.7.4",
1414
"@begin/data": "^2.0.1",
15+
"dotenv": "^10.0.0",
1516
"eslint": "^7.27.0",
1617
"puppeteer": "^10.1.0",
18+
"slugify": "^1.6.0",
1719
"tap-spec": "^5.0.0",
1820
"tape": "^5.3.1",
1921
"tiny-json-http": "^7.3.0"

scripts/download-speakers.js

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
require('dotenv').config()
2+
let fetch = require('node-fetch')
3+
let fs = require('fs')
4+
let slugify = require('slugify')
5+
6+
let appId = process.env.AIRTABLE_APP_ID
7+
let appKey = process.env.AIRTABLE_APP_KEY
8+
let speakerViewId = process.env.AIRTABLE_SPEAKER_VIEW
9+
let baseUrl = `https://api.airtable.com/v0/${ appId }`
10+
11+
async function fetchTopics() {
12+
let fields = ['Name']
13+
let json = await fetch(`${ baseUrl }/Topics?view=Grid%20view${ fields.map((f) => '&fields%5B%5D='+encodeURIComponent(f)).join('') }`, { headers: {'Authorization': `Bearer ${ appKey }`}})
14+
let results = await json.json()
15+
return results.records.map((r) => ( { id: r.id, name: r.fields.Name } ))
16+
}
17+
18+
async function fetchSpeakers({ topics }) {
19+
let fields = ['Name', 'Location', 'Talk Title', 'Abstract', 'Reveal', 'Pixelated', 'Topic(s)', 'Pronouns', 'Twitter', 'Website', 'Company']
20+
let json = await fetch(`${ baseUrl }/Speakers?view=${ speakerViewId }${ fields.map((f) => '&fields%5B%5D='+encodeURIComponent(f)).join('') }`, { headers: {'Authorization': `Bearer ${ appKey }`}})
21+
let results = await json.json()
22+
let members = results.records.map((r) => { return {
23+
table: 'speakers',
24+
key: slugify(r.fields['Name'], { lower: true }),
25+
name: r.fields['Name'],
26+
location: r.fields['Location'],
27+
title: r.fields['Talk Title'],
28+
abstract: r.fields['Abstract'],
29+
reveal: r.fields['Reveal'],
30+
pixelated: r.fields['Pixelated'],
31+
topics: r.fields['Topic(s)']
32+
.map((id) => topics.find((t) => t.id === id)) // grab the skill objects that match the ids
33+
.map((t) => t.name), // grab the Name
34+
pronouns: r.fields['Pronouns'],
35+
twitter: r.fields['Twitter'],
36+
website: r.fields['Website'],
37+
company: r.fields['Company']
38+
} })
39+
return members
40+
}
41+
42+
async function init() {
43+
// get speakers from Airtable
44+
let topics = await fetchTopics()
45+
let speakers = await fetchSpeakers({ topics })
46+
console.log(`Writing ${ speakers.length } speakers to data/staging/speakers.json`)
47+
// write these bits to JSON
48+
fs.writeFileSync('./data/staging/speakers.json', JSON.stringify(speakers))
49+
}
50+
51+
init()

src/views/modules/ui/speaker.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ export default function Speaker(props) {
1818
// don't reveal the speaker yet!
1919
if (!revealed) {
2020
name = 'Secret Speaker'
21-
photoUrl = `https://create-4jr-staging.begin.app/_static/2020-pixelated/${ speaker.pixelated }.png`
21+
photoUrl = `https://create-4jr.begin.app/_static/2021-pixelated/${ speaker.pixelated }.png`
2222
}
2323
else {
2424
key = speaker.key
2525
name = speaker.name
26-
photoUrl = `https://create-4jr-staging.begin.app/_static/2020/${ speaker.key }.jpg`
26+
photoUrl = `https://create-4jr.begin.app/_static/2021/${ speaker.key }.jpg`
2727
}
2828

2929
return `

0 commit comments

Comments
 (0)