Skip to content

Commit ee85bac

Browse files
authored
Merge pull request #23 from zernonia/20-add-tweet-embed
20 add tweet embed
2 parents 673f937 + 67f5e32 commit ee85bac

File tree

6 files changed

+109
-291
lines changed

6 files changed

+109
-291
lines changed

src/blocks/helpers/tweet.ts

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { reactive, onBeforeMount } from "vue"
2+
3+
const store = reactive({
4+
callbacks: [] as any[],
5+
})
6+
7+
export const useTwttr = (cb: () => any) => {
8+
onBeforeMount(() => {
9+
let twttrScript = document.getElementById("twitter-widgets-js")
10+
if (!twttrScript) {
11+
store.callbacks.push(cb)
12+
var s = document.createElement("script")
13+
s.id = "twitter-widgets-js"
14+
s.src = "https://platform.twitter.com/widgets.js"
15+
s.onload = () => store.callbacks.forEach((cb) => cb())
16+
document.body.appendChild(s)
17+
} else {
18+
store.callbacks.push(cb)
19+
}
20+
})
21+
}

src/blocks/tweet.vue

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<script setup lang="ts">
2+
import { useNotionBlock, defineNotionProps } from "@/lib/blockable"
3+
import { computed, onBeforeMount, getCurrentInstance, ref, onMounted } from "vue"
4+
import { useTwttr } from "./helpers/tweet"
5+
6+
const props = defineProps({ ...defineNotionProps })
7+
//@ts-ignore
8+
const { properties } = useNotionBlock(props)
9+
10+
const tweetId = computed(() => properties.value?.source?.[0]?.[0].split("status/")?.[1])
11+
const el = ref<HTMLElement>()
12+
const error = ref()
13+
14+
const renderTweet = () => {
15+
//@ts-ignore
16+
const twttr = window["twttr"]
17+
//@ts-ignore
18+
twttr?.ready().then(({ widgets }) => {
19+
widgets
20+
.createTweetEmbed(tweetId.value, el.value, {})
21+
.then((element: any) => {
22+
error.value = element ? undefined : "error"
23+
})
24+
.catch((err: any) => {
25+
error.value = err
26+
})
27+
})
28+
}
29+
useTwttr(renderTweet)
30+
onMounted(() => {
31+
renderTweet()
32+
})
33+
</script>
34+
35+
<script lang="ts">
36+
export default {
37+
name: "NotionTweet",
38+
}
39+
</script>
40+
41+
<template>
42+
<div v-if="!error" class="notion-tweet" ref="el"></div>
43+
<div v-else class="notion-tweet-error">Error loading Tweet</div>
44+
</template>

src/components/block.vue

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import NotionSyncBlock from "@/blocks/sync-block.vue"
2121
import NotionSyncPointerBlock from "@/blocks/sync-pointer-block.vue"
2222
2323
const NotionCode = defineAsyncComponent(() => import("@/blocks/code.vue"))
24+
const NotionTweet = defineAsyncComponent(() => import("@/blocks/tweet.vue"))
2425
2526
const props = defineProps({ ...defineNotionProps })
2627
//@ts-ignore
@@ -61,5 +62,6 @@ if (!availableType.includes(type.value)) console.warn(`${type.value.toUpperCase(
6162
<NotionTableOfContents v-else-if="isType('table_of_contents')" v-bind="pass"></NotionTableOfContents>
6263
<NotionSyncBlock v-else-if="isType('transclusion_container')"><slot /></NotionSyncBlock>
6364
<NotionSyncPointerBlock v-else-if="isType('transclusion_reference')" v-bind="pass"></NotionSyncPointerBlock>
65+
<NotionTweet v-else-if="isType('tweet')" v-bind="pass"></NotionTweet>
6466
<hr v-else-if="isType('divider')" class="notion-hr" />
6567
</template>

src/lib/constant.ts

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export const availableType = [
2222
"audio",
2323
"table",
2424
"table_row",
25+
"tweet",
2526
"divider",
2627
"table_of_contents",
2728
"transclusion_container",

src/style.css

+11
Original file line numberDiff line numberDiff line change
@@ -2470,6 +2470,17 @@ svg.notion-page-icon {
24702470
text-decoration-color: var(--fg-color-1);
24712471
}
24722472

2473+
.notion-tweet {
2474+
display: flex;
2475+
justify-content: center;
2476+
}
2477+
.notion-tweet-error {
2478+
font-size: 0.8rem;
2479+
padding: 0.5rem 1rem;
2480+
border: 1px solid rgb(233, 233, 231);
2481+
border-radius: 3px;
2482+
}
2483+
24732484
.token.operator,
24742485
.token.entity,
24752486
.token.url,

0 commit comments

Comments
 (0)