mirror of
https://github.com/jbowdre/runtimeterror.git
synced 2024-11-22 15:02:18 +00:00
publish post
This commit is contained in:
parent
8d45cad212
commit
b97a1b2abb
2 changed files with 47 additions and 13 deletions
|
@ -2,7 +2,6 @@
|
||||||
title: "Kudos With Cabin"
|
title: "Kudos With Cabin"
|
||||||
date: 2024-06-24
|
date: 2024-06-24
|
||||||
# lastmod: 2024-06-24
|
# lastmod: 2024-06-24
|
||||||
draft: true
|
|
||||||
description: "Using Cabin's event tracking to add a simple post upvote widget to my Hugo site."
|
description: "Using Cabin's event tracking to add a simple post upvote widget to my Hugo site."
|
||||||
featured: false
|
featured: false
|
||||||
toc: true
|
toc: true
|
||||||
|
@ -120,31 +119,66 @@ I got carried away a little bit and decided to add a fun animation when the butt
|
||||||
|
|
||||||
### JavaScript
|
### JavaScript
|
||||||
|
|
||||||
I want the button to do a little bit more than *just* send the event to Cabin so I decided to break that out into a separate script, `assets/js/kudos.js`:
|
I want the button to do a little bit more than *just* send the event to Cabin so I decided to break that out into a separate script, `assets/js/kudos.js`. This script will latch on to the kudos-related elements, and when the button gets clicked it will (1) fire off the `cabin.event('kudos')` function to record the event, (2) disable the button to discourage repeated clicks, (3) change the displayed text to `Thanks!`, and (4) celebrate the event by spinning the emoji and replacing it with a party popper.
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
// torchlight! {"lineNumbers":true}
|
// torchlight! {"lineNumbers":true}
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
// manipulates the post upvote "kudos" button behavior
|
||||||
// select the elements to manipulate
|
|
||||||
|
window.onload = function() {
|
||||||
|
// get the button and text elements
|
||||||
var kudosButton = document.querySelector('.kudos-button');
|
var kudosButton = document.querySelector('.kudos-button');
|
||||||
var kudosText = document.querySelector('.kudos-text');
|
var kudosText = document.querySelector('.kudos-text');
|
||||||
var emojiSpan = kudosButton.querySelector('.emoji');
|
var emojiSpan = kudosButton.querySelector('.emoji');
|
||||||
|
|
||||||
kudosButton.addEventListener('click', () => {
|
kudosButton.addEventListener('click', function(event) {
|
||||||
|
// send the event to Cabin
|
||||||
cabin.event('kudos')
|
cabin.event('kudos')
|
||||||
|
// disable the button
|
||||||
kudosButton.disabled = true;
|
kudosButton.disabled = true;
|
||||||
kudosButton.classList.add('clicked');
|
kudosButton.classList.add('clicked');
|
||||||
|
// change the displayed text
|
||||||
kudosText.textContent = 'Thanks!';
|
kudosText.textContent = 'Thanks!';
|
||||||
kudosText.classList.add('thanks');
|
kudosText.classList.add('thanks');
|
||||||
|
// spin the emoji
|
||||||
// Rotate the emoji
|
|
||||||
emojiSpan.style.transform = 'rotate(360deg)';
|
emojiSpan.style.transform = 'rotate(360deg)';
|
||||||
|
// change the emoji to celebrate
|
||||||
// Change the emoji after rotation
|
setTimeout(function() {
|
||||||
setTimeout(() => {
|
|
||||||
emojiSpan.textContent = '🎉';
|
emojiSpan.textContent = '🎉';
|
||||||
}, 150); // Half of the transition time for a smooth mid-rotation change
|
}, 150); // half of the css transition time for a smooth mid-rotation change
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The last step is to go back to my `single.html` layout and pull in this new JavaScript file. I placed it in the site's `assets/` folder so that Hugo can apply its minifying magic so I'll need to load it in as a page resource:
|
||||||
|
|
||||||
|
```html
|
||||||
|
# torchlight! {"lineNumbers":true}
|
||||||
|
<div class="content__body"> <!-- [tl! reindex(33)] -->
|
||||||
|
{{ .Content }}
|
||||||
|
</div>
|
||||||
|
{{- $reply := true }} <!-- [tl! collapse:6] -->
|
||||||
|
{{- if eq .Site.Params.reply false }}
|
||||||
|
{{- $reply = false }}
|
||||||
|
{{- else if eq .Params.reply false }}
|
||||||
|
{{- $reply = false }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if eq $reply true }}
|
||||||
|
<hr>
|
||||||
|
<div class="kudos-container">
|
||||||
|
<button class="kudos-button">
|
||||||
|
<span class="emoji">👍</span>
|
||||||
|
</button>
|
||||||
|
<span class="kudos-text">Enjoyed this?</span>
|
||||||
|
</div>
|
||||||
|
{{ $kudos := resources.Get "js/kudos.js" | minify }} <!-- [tl! ++:1 **:1] -->
|
||||||
|
<script src="{{ $kudos.RelPermalink }}"></script>
|
||||||
|
<span class="post_email_reply"><a href="mailto:replies@example.com?Subject=Re: {{ .Title }}">📧 Reply by email</a></span>
|
||||||
|
{{- end }}
|
||||||
|
```
|
||||||
|
|
||||||
|
And that's it! After clicking the 👍 button on a few pages I can see the `kudos` events recorded in my [Cabin portal](https://l.runtimeterror.dev/rterror-stats):
|
||||||
|
![A few hits against the 'kudos' event](kudos-in-cabin.png)
|
||||||
|
|
||||||
|
|
||||||
|
Go on, try it out:
|
BIN
content/posts/kudos-with-cabin/kudos-in-cabin.png
Normal file
BIN
content/posts/kudos-with-cabin/kudos-in-cabin.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
Loading…
Reference in a new issue