mirror of
https://github.com/Lissy93/dashy.git
synced 2024-12-28 11:25:25 +03:00
✨ basic Widget which fetches the HN posts
This commit is contained in:
parent
c1512012f9
commit
cfdd4a13e8
@ -1,10 +1,20 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="hackernews-wrapper">
|
<div class="hackernews-wrapper">
|
||||||
<h3>Hackernews Trending</h3>
|
|
||||||
|
|
||||||
<!-- Hackernews Trending Posts-->
|
<!-- Hackernews Trending Posts-->
|
||||||
<div class="posts-wrapper">
|
<div class="posts-wrapper" v-if="trendingPosts">
|
||||||
|
<div class="post-row" v-for="(trendingPosts, index) in trendingPosts" :key="index">
|
||||||
|
<a class="post-top" :href="trendingPosts.originURL">
|
||||||
|
<div class="post-title-wrap">
|
||||||
|
<p class="post-title">{{ trendingPosts.title }}</p>
|
||||||
|
<div class="score-wrap">
|
||||||
|
<p class="post-date">
|
||||||
|
{{ formatDate(trendingPosts.time) }}
|
||||||
|
</p>
|
||||||
|
<p class="post-date" v-if="trendingPosts.score">score: {{ trendingPosts.score }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -21,34 +31,126 @@ export default {
|
|||||||
trendingPosts: null,
|
trendingPosts: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
filters: {
|
|
||||||
debug() { console.debug('Not implemented'); },
|
|
||||||
},
|
|
||||||
computed: {
|
computed: {
|
||||||
storyType() {
|
storyType() {
|
||||||
// This can be `beststories`, `topstories` or newstories
|
// This can be `beststories`, `topstories` or newstories
|
||||||
return this.options.stories || 'beststories';
|
// TODO: display error message if another string not matching the keywords was insert
|
||||||
|
return this.options.stories || 'topstories';
|
||||||
},
|
},
|
||||||
limit() {
|
limit() {
|
||||||
return this.options.limit || 10;
|
return this.options.limit || 10;
|
||||||
},
|
},
|
||||||
endpoint() {
|
endpoint() {
|
||||||
return `${widgetApiEndpoints.hackernewsTrending}/${this.storyType}.json`
|
return `${widgetApiEndpoints.hackernewsTrending}/${this.storyType}.json`;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
fetchData() {
|
fetchData() {
|
||||||
console.log("Let's fetch some Data");
|
this.makeRequest(this.endpoint).then(this.fetchPostDetails);
|
||||||
this.makeRequest(this.endpoint).then(this.fetchPostDetails)
|
|
||||||
},
|
},
|
||||||
async fetchPostDetails(data) {
|
async fetchPostDetails(data) {
|
||||||
const topPosts = data.slice(0, this.limit)
|
const topPosts = data.slice(0, this.limit);
|
||||||
const allData = topPosts.map((post) => {
|
const allData = topPosts.map((post) => {
|
||||||
const url = `${widgetApiEndpoints.hackernewsTrending}/item/${post}.json`;
|
const url = `${widgetApiEndpoints.hackernewsTrending}/item/${post}.json`;
|
||||||
return this.makeRequest(url);
|
return this.makeRequest(url);
|
||||||
})
|
})
|
||||||
Promise.all(allData).then((values) => console.log(values))
|
Promise.all(allData).then((resolvedPostValues) => {
|
||||||
|
this.trendingPosts = resolvedPostValues.map((element, index) => {
|
||||||
|
element.originURL = `https://news.ycombinator.com/item?id=${topPosts.at(index)}`
|
||||||
|
return element
|
||||||
|
});
|
||||||
|
console.log(this.trendingPosts)
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
formatDate(unixTime) {
|
||||||
|
const date = new Date(unixTime * 1000);
|
||||||
|
// Then specify how you want your dates to be formatted
|
||||||
|
return new Intl.DateTimeFormat('default', {dateStyle: 'long'}).format(date);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.hackernews-wrapper {
|
||||||
|
.meta-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
text-decoration: none;
|
||||||
|
margin: 0.25rem 0 0.5rem 0;
|
||||||
|
p.feed-title {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: var(--widget-text-color);
|
||||||
|
}
|
||||||
|
p.feed-author {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
opacity: var(--dimming-factor);
|
||||||
|
color: var(--widget-text-color);
|
||||||
|
}
|
||||||
|
img.feed-icon {
|
||||||
|
border-radius: var(--curve-factor);
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
margin-right: 0.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.post-row {
|
||||||
|
border-top: 1px dashed var(--widget-text-color);
|
||||||
|
padding: 0.5rem 0 0.25rem 0;
|
||||||
|
.post-top {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
text-decoration: none;
|
||||||
|
p.post-title {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: bold;
|
||||||
|
color: var(--widget-text-color);
|
||||||
|
}
|
||||||
|
p.post-date {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
margin: 0;
|
||||||
|
opacity: var(--dimming-factor);
|
||||||
|
color: var(--widget-text-color);
|
||||||
|
}
|
||||||
|
img.post-img {
|
||||||
|
border-radius: var(--curve-factor);
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
margin-right: 0.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.post-body {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
color: var(--widget-text-color);
|
||||||
|
max-height: 400px;
|
||||||
|
overflow: hidden;
|
||||||
|
::v-deep p {
|
||||||
|
margin: 0.5rem 0;
|
||||||
|
}
|
||||||
|
::v-deep img {
|
||||||
|
max-width: 80%;
|
||||||
|
display: flex;
|
||||||
|
margin: 0 auto;
|
||||||
|
border-radius: var(--curve-factor);
|
||||||
|
}
|
||||||
|
::v-deep a {
|
||||||
|
color: var(--widget-text-color);
|
||||||
|
}
|
||||||
|
::v-deep svg path {
|
||||||
|
fill: var(--widget-text-color);
|
||||||
|
}
|
||||||
|
::v-deep blockquote {
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
padding-left: 0.5rem;
|
||||||
|
border-left: 4px solid var(--widget-text-color);
|
||||||
|
}
|
||||||
|
::v-deep .avatar.avatar-user { display: none; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
Loading…
Reference in New Issue
Block a user