Skip to content
This repository was archived by the owner on Jun 24, 2021. It is now read-only.

Commit 8efec16

Browse files
add timestamp reaveal in work card
1 parent cb3b33e commit 8efec16

9 files changed

Lines changed: 177 additions & 122 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Works! is a Simple To-do list website.
2020
1. Clone this repo from Github.
2121
2. Install node v14+ on your device.
2222
3. In the root of project folder, run `npm install`.
23-
- if you meet some error on this step, try to add `--legacy-peer-deps` after previous command and run again.
23+
- if you meet some error on this step, try to add `--force` after previous command and run again.
2424

2525
4. run `npm run serve`, and you may see the website serve on http://localhost:8080 (port number may different).
2626

package-lock.json

Lines changed: 128 additions & 114 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
},
1515
"devDependencies": {
1616
"@popperjs/core": "^2.6.0",
17-
"@types/bootstrap": "^5.0.1",
17+
"@types/bootstrap": "^5.0.2",
1818
"@types/lozad": "^1.9.0",
1919
"@typescript-eslint/eslint-plugin": "^4.12.0",
2020
"@typescript-eslint/parser": "^4.12.0",
@@ -25,12 +25,13 @@
2525
"@vue/cli-service": "^4.5.10",
2626
"@vue/compiler-sfc": "^3.0.5",
2727
"@vue/eslint-config-typescript": "^7.0.0",
28-
"autoprefixer": "^10.2.0",
28+
"autoprefixer": "^10.2.1",
2929
"axios": "^0.21.1",
3030
"bootstrap": "^5.0.0-beta1",
31+
"dayjs": "^1.10.2",
3132
"eslint": "^7.17.0",
3233
"eslint-plugin-vue": "^7.4.1",
33-
"firebase": "^8.2.1",
34+
"firebase": "^8.2.2",
3435
"lint-staged": "^10.5.3",
3536
"lozad": "^1.16.0",
3637
"postcss": "^8.2.3",

src/components/Carousel.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export default defineComponent({
6565
6666
for (let i = 0; i < data.imageList.length; i++) {
6767
data.forceLoad[i] = true
68-
await new Promise<void>(resolve => setTimeout(() => resolve(), 300))
68+
await new Promise<void>(resolve => setTimeout(() => resolve(), 500))
6969
}
7070
})
7171

src/components/LazyImg.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export default defineComponent({
4141
})
4242
4343
const forceLoadService = () => {
44-
watchEffect(() => {
44+
watchEffect(async () => {
4545
if (props['forceLoad']) {
4646
observer.triggerLoad(img.value)
4747
}

src/components/Work.vue

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
</div>
88
<LazyImg :d-src="finalThumbnail" class="card-img-top img-fluid rounded-3 py-3 px-3"/>
99
<div class="card-body">
10+
<span class="badge bg-light rounded-pill text-dark user-select-none">{{ createdAt }}</span>
1011
<h5 class="card-title text-dark">{{ title }}</h5>
1112
<p class="card-subtitle text-dark">{{ subtitle }}</p>
1213
</div>
@@ -39,6 +40,11 @@ export default defineComponent({
3940
type: String,
4041
default: '',
4142
required: true
43+
},
44+
createdAt: {
45+
type: String,
46+
default: '',
47+
required: true
4248
}
4349
},
4450
components: {

src/components/WorkView.vue

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<div :key="workViewKey" :class="{'invisible':processing}"
2424
class="row mw-100 position-relative mx-auto justify-content-center">
2525
<WorkCard v-for="(work, k) in works" :key="k"
26+
:created-at="timestampConversion(work.createdAt)"
2627
:subtitle="work.subtitle"
2728
:thumbnail="work.thumbnail"
2829
:title="work.title" :uid="work.id" class="col-3" @remove="remove"/>
@@ -43,10 +44,11 @@
4344
<script lang="ts">
4445
import {defineComponent, inject, onMounted, reactive, toRefs, defineAsyncComponent, nextTick} from 'vue';
4546
import '@/scss/components/work-view.scss'
46-
import {dbType, Work} from "@/firebase/type";
47+
import {dbType, Work, time} from "@/firebase/type";
4748
import {getCurrentWorks, liveSubscribe} from "@/firebase/getWork";
4849
import '@/svg/todo.svg'
4950
import '@/svg/add.svg'
51+
import timeFormater from "@/util/timeFormater";
5052
5153
export default defineComponent({
5254
name: 'WorkView',
@@ -91,6 +93,10 @@ export default defineComponent({
9193
})
9294
}
9395
96+
const timestampConversion = (timestamp: time): string => {
97+
return timeFormater(timestamp.toDate().valueOf())
98+
}
99+
94100
onMounted(async () => {
95101
data.processing = true
96102
await displayWorks()
@@ -100,6 +106,7 @@ export default defineComponent({
100106
101107
return {
102108
remove,
109+
timestampConversion,
103110
...toRefs(data)
104111
}
105112
}

src/firebase/type.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import firebase from "firebase";
33
export type firebaseType = firebase.app.App
44
export type dbType = firebase.firestore.Firestore
55
export type time = firebase.firestore.Timestamp
6-
export type querySnapshot = firebase.firestore.QuerySnapshot<firebase.firestore.DocumentData>
76

87
export interface WorkDocument {
98
title: string;

src/util/timeFormater.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import dayjs from 'dayjs'
2+
import 'dayjs/locale/zh-tw'
3+
import customParseFormat from 'dayjs/plugin/customParseFormat'
4+
import isYesterday from 'dayjs/plugin/isYesterday'
5+
import isToday from 'dayjs/plugin/isToday'
6+
7+
dayjs.extend(isToday)
8+
dayjs.extend(isYesterday)
9+
dayjs.extend(customParseFormat)
10+
dayjs.locale('zh-tw')
11+
12+
export default function (time?: number | undefined): string {
13+
const now = dayjs()
14+
const product = dayjs(time)
15+
let year: string | undefined
16+
const yearDistance = now.year() - product.year()
17+
switch (yearDistance) {
18+
case 0:
19+
year = undefined
20+
break
21+
default:
22+
year = product.format('YYYY/')
23+
break
24+
}
25+
const monthAndDay = product.isToday() ? undefined : (product.isYesterday() ? '昨天' : product.format('M/D'))
26+
const hourAndMinute = product.format('h:mm a')
27+
return [year ? (year + monthAndDay) : monthAndDay, hourAndMinute].join('\n')
28+
}

0 commit comments

Comments
 (0)