Commit Graph

684 Commits

Author SHA1 Message Date
keyan b2508b738a make anon hat appear on profile 2023-08-11 14:12:18 -05:00
keyan 9c6ecf9526 correct overlay zap text for anon 2023-08-11 12:43:18 -05:00
keyan e4c2d113ef remove redundant meTotalSats 2023-08-11 12:41:02 -05:00
ekzyis 41f46cf41e Fix empty invoice creation attempts
I stumbled across this while checking if anons can edit their items.

I monkey patched the code to make it possible (so they can see the 'edit' button) and tried to edit an item but I got this error:

  Variable "$amount" of required type "Int!" was not provided.

I fixed this even though this function should never be called without an amount anyway. It will return a sane error in that case now.
2023-08-11 05:30:22 +02:00
ekzyis 28b4588a12 Fix [object Object] as error message
Any errors thrown here are already objects of shape { message: string }
2023-08-11 05:30:06 +02:00
keyan d92701c56f don't abbreviate 2023-08-10 19:58:33 -05:00
keyan ea9c405dfa add sat amounts to invoices 2023-08-10 18:33:57 -05:00
keyan 53a6c9489f fix forgotten find and replace 2023-08-10 17:40:50 -05:00
keyan 26762efcea add generic date pivot helper 2023-08-10 17:36:49 -05:00
keyan 46274fba4f give anon an icon 2023-08-10 17:36:49 -05:00
ekzyis 2fbf1e4cc3 Keep track of modal stack 2023-08-11 00:35:43 +02:00
ekzyis 49736e8d3c Always show repeat and contacts on action error 2023-08-10 23:04:06 +02:00
keyan 081c5fef0b make anon posting less hidden, add anon info button explainer 2023-08-10 14:41:56 -05:00
Keyan cbfd6998a6
Merge branch 'master' into 266-zaps-without-account 2023-08-10 12:40:30 -05:00
ekzyis bb2212d51e Add invoice HMAC
This prevents entities which know the invoice hash (like all LN nodes on the payment path) from using the invoice hash on SN.

Only the user which created the invoice knows the HMAC and thus can use the invoice hash.
2023-08-10 07:10:07 +02:00
ekzyis 4fe1d416de Fix onConfirmation called at every render 2023-08-10 04:13:09 +02:00
ekzyis 318088179a Rename to useInvoiceable 2023-08-10 03:34:38 +02:00
ekzyis 38dbbd5a4f Fix comment copy-paste error 2023-08-10 03:34:38 +02:00
ekzyis 118f591d04 Merge branch 'master' into 266-zaps-without-account 2023-08-10 03:34:38 +02:00
SatsAllDay d5f7855adf
Debounce API requests on edit nym by 500ms (#387)
Support an optional debounce prop on Input component

If provided, the debounce is applied to the validation of the containing form,
imperatively invoking form validation after debounce is finalized

Also required introducing the `validateOnChange` prop on `Form` which gets passed to `Formik`, and defaults to true, just as it does in `Formik`.

Imperatively invoking form validation seemed to be the only way to debounce the validation call through formik.
2023-08-09 17:06:22 -05:00
keyan b92f63ca88 fix remaining misuses of plural units 2023-08-08 17:15:30 -05:00
keyan da78d244ef handle when navigator controller isn't present 2023-08-08 16:55:53 -05:00
keyan 3cfeede46a handle all singular units appropriately 2023-08-08 16:47:27 -05:00
SatsAllDay 9941bc6519
render "reply" or "replies", "comment" or "comments" depending on the count (singular or plural) (#382)
Co-authored-by: Keyan <34140557+huumn@users.noreply.github.com>
2023-08-08 16:07:00 -05:00
SatsAllDay 6e05cd38f9
Singular/Plural "Sats" labels (#380)
Co-authored-by: keyan <keyan.kousha+huumn@gmail.com>
2023-08-08 16:04:06 -05:00
ekzyis 67a0de3ea5
Notifications with nostr info (#368)
* Show zap message and pubkey in notifications

+ show zap request event in invoice view

* enhance ui

---------

Co-authored-by: ekzyis <ek@stacker.news>
Co-authored-by: keyan <keyan.kousha+huumn@gmail.com>
2023-08-08 13:19:31 -05:00
Keyan 76b4156ccb
Merge branch 'master' into 266-zaps-without-account 2023-08-08 09:42:21 -05:00
ekzyis e3c60d1ef8
Sync push subscriptions on every page load (#370)
Most browsers don't support the pushsubscriptionchange event.

We workaround this by saving the current push subscription in IndexedDB so we can check during every page load if the push subscription changed.

If that is the case, we manually sync the push subscription with the server.

However, this solution is not perfect as mentioned in https://medium.com/@madridserginho/how-to-handle-webpush-api-pushsubscriptionchange-event-in-modern-browsers-6e47840d756f which was used for reference:

> This solution is not perfect, the user could lose some push notifications if he doesn’t open the webapp for a long time.

Co-authored-by: ekzyis <ek@stacker.news>
2023-08-07 20:03:34 -05:00
ekzyis 7369bd819d
Add nostr login (#367)
Co-authored-by: keyan <keyan.kousha+huumn@gmail.com>
2023-08-07 19:50:01 -05:00
keyan a0974e4d6c Merge branch 'master' into 266-zaps-without-account 2023-08-07 16:48:52 -05:00
keyan a3b668587d fix top cowboys 2023-08-07 16:26:15 -05:00
Keyan 3d0bb4b32c
Merge branch 'master' into 266-zaps-without-account 2023-08-07 15:10:20 -05:00
keyan 0867f3ff1c only outline eldest new comment ... unset on touch 2023-08-07 09:29:47 -05:00
keyan d661c70f16 more noticable new comment indicator 2023-08-06 14:31:24 -05:00
keyan 1efc17fcc2 subtle highlight of new comments 2023-08-06 14:18:40 -05:00
keyan ea1e31c6ee prevent horizontal layout shift on new comments 2023-08-06 13:21:38 -05:00
keyan ebfff4677f fix top header/stat order on back/forward nav 2023-08-06 13:13:32 -05:00
keyan 90f4d41fc8 remove list jitter by initially preferring ssr 2023-08-06 13:04:25 -05:00
keyan eeaf6e10e5 reduce rerenders in notifications 2023-08-06 10:47:58 -05:00
keyan b9fdbde520 fix back button render jitter 2023-08-05 12:56:03 -05:00
keyan d9dd4bc05b prevent scroll to comment on rerender 2023-08-05 12:13:15 -05:00
keyan aea8948c45 dark-mode needs to block block 2023-08-04 20:45:12 -05:00
keyan 8d8e2859dd fix dark mode 2023-08-04 19:21:51 -05:00
keyan 23257d8c63 fix notifications glitchiness 2023-08-04 12:08:16 -05:00
keyan 42234eae9b highlight notification on back button 2023-08-03 19:14:04 -05:00
keyan 4e41f67e87 fix notification url replacement 2023-08-03 18:04:43 -05:00
keyan 94e975033c fix fee button receipt background color 2023-08-03 15:13:07 -05:00
keyan 0ab9119739 improve notifications UX: highlight reply and distinguish new notifications 2023-08-03 14:56:59 -05:00
keyan 7596b0302a improve click to context behavior and add ssrForceFetchDelay to apollo 2023-08-03 13:13:49 -05:00
keyan b1b8f9de56 implement our own nprogress bar 2023-08-01 21:06:15 -05:00
keyan e1c51075a2 fix conditional nextFetchPolicy overriding cache-only on SSR and suppress time hydration warnings 2023-07-31 14:54:30 -05:00
keyan f91be5d70f fix form skeleton 2023-07-31 12:35:58 -05:00
keyan b42a934207 fix invites signup via lightning/slashtags 2023-07-31 09:19:53 -05:00
keyan bc5a19c6ee suppress hydration warnings when relative time is rendered 2023-07-31 09:12:56 -05:00
keyan d2216e80da conform to linter 2023-07-31 08:39:10 -05:00
ekzyis ba04e6522d Also strike on payment after short press 2023-07-30 23:45:08 +02:00
ekzyis d186e869e1 Allow pay per invoice for bounty and job posts 2023-07-30 23:45:08 +02:00
ekzyis f2f09b22c4 Fix invoice amount for comments 2023-07-30 23:45:08 +02:00
ekzyis 1cd9750be5 Fix insufficient funds error detection 2023-07-30 23:45:08 +02:00
ekzyis 773f658e00 Remove duplicate insufficient funds handling 2023-07-30 23:45:08 +02:00
ekzyis 6b4b5023f6 Keep invoice modal open if focus is lost 2023-07-30 23:45:07 +02:00
ekzyis 853a389b65 Allow pay per invoice for stackers
The modal which pops up if the stacker does not have enough sats now has two options: "fund wallet" and "pay invoice"
2023-07-30 23:45:07 +02:00
ekzyis fd8510d59f Use payment hash instead of invoice id as proof of payment
Our invoice IDs can be enumerated.
So there is a - even though very rare - chance that an attacker could find a paid invoice which is not used yet and use it for himself.
Random payment hashes prevent this.

Also, since we delete invoices after use, using database IDs as proof of payments are not suitable.
If a user tells us an invoice ID after we deleted it, we can no longer tell if the invoice was paid or not since the LN node only knows about payment hashes but nothing about the database IDs.
2023-07-30 23:45:07 +02:00
ekzyis 74893b09dd Add anon comments and posts (link, discussion, poll) 2023-07-30 23:45:07 +02:00
ekzyis 5415c6b0f6 Add anon zaps 2023-07-30 23:45:07 +02:00
keyan 42bdd40f91 show errors on settings during auth linking 2023-07-30 15:39:18 -05:00
keyan 5232b59625 upgrade to next-auth 4 (bonus: improve error pages) 2023-07-29 14:38:20 -05:00
keyan 7490e5c249 fix syntax highlighting warnings 2023-07-27 12:10:05 -05:00
keyan 7542dd6cc4 upgrade to prisma 4 2023-07-26 19:18:42 -05:00
keyan 5a4f63b1d5 fix pinned discussion spacing 2023-07-26 08:48:46 -05:00
keyan 8ea9938cb0 fix broken image text 2023-07-25 20:02:43 -05:00
keyan 8ab018af88 fix nested comment sorting 2023-07-25 19:45:35 -05:00
keyan 19835aef5f fix undefined sub on post pre-form 2023-07-25 15:41:46 -05:00
keyan 4c1ef62386 fix edit bio button location 2023-07-25 15:32:49 -05:00
keyan 98552c853c fix back button behavior on select navigation 2023-07-25 15:29:45 -05:00
keyan 4bfd021342 enhance styling 2023-07-25 13:32:48 -05:00
keyan ab2046ab0b fix issues with new linting 2023-07-25 09:14:45 -05:00
keyan dae9c64e96 more package updates 2023-07-24 19:50:55 -05:00
keyan e87610c45b update packages and reduce bundle size 2023-07-24 17:50:12 -05:00
keyan 356f7e072c 50% reduction in bundle size by being careful with big imports 2023-07-24 16:06:26 -05:00
keyan 6407455def upgrade react-bootstrap 2023-07-24 13:53:53 -05:00
keyan 59f7b6ff26 Revert "Revert "shield your eyes; massive, squashed refactor; nextjs/react/react-dom/apollo upgrades""
This reverts commit 18910fa2ed.
2023-07-23 10:08:43 -05:00
keyan 18910fa2ed Revert "shield your eyes; massive, squashed refactor; nextjs/react/react-dom/apollo upgrades"
This reverts commit d0314ab73c.
2023-07-23 09:16:12 -05:00
keyan d0314ab73c shield your eyes; massive, squashed refactor; nextjs/react/react-dom/apollo upgrades 2023-07-21 17:33:11 -05:00
keyan 253d75b438 fix item icon fix 2023-07-15 11:35:10 -05:00
keyan 3c3de2eb24 fix item icon styling 2023-07-14 11:07:03 -05:00
keyan 7a4ba715e0 memoize table of contents 2023-07-13 15:56:57 -05:00
keyan 3c711b6083 enhance image detection and proxy 2023-07-13 15:18:04 -05:00
ekzyis 0d3328e509
Show longest cowboy streak in profile (#353)
* Show longest cowboy streak in profile

* Fix image offset

* Initialize maxStreak for every user

* Use resolver instead of denormalization for maxStreak

---------

Co-authored-by: ekzyis <ek@stacker.news>
2023-07-12 19:10:29 -05:00
Jo Wo bf4b8714fe
Render images without markdown and use image proxy (#245)
* Parse image links during markdown rendering

* Use imgproxy to replace links

* Add healthcheck

See https://docs.imgproxy.net/healthcheck

* Enable WebP and animation support

* Only replace image URLs

* Replace all occurrences

* Fix creating posts with no text

* Embed image on link posts where link is image

---------

Co-authored-by: ekzyis <ek@stacker.news>
2023-07-12 19:10:01 -05:00
keyan bc9081eaab fix race condition caused by race condition fix 2023-07-11 13:33:13 -05:00
keyan efa3172f15 top stackers sorted stat to front 2023-07-10 12:59:21 -05:00
keyan 34ba823bd4 account for no funds on zap debounce 2023-07-09 13:08:56 -05:00
keyan e8aa0a4dae users? => stackers? 2023-07-09 12:53:50 -05:00
keyan 4e9138dfdc show more info on where zap rewards came from 2023-07-09 12:21:11 -05:00
keyan f33534dd36 fix rapid voting ui race condition (#213) 2023-07-09 11:15:46 -05:00
keyan e0d89a289b fix lightning animation z-index 2023-07-06 18:07:30 -05:00
keyan ec9a424bf4 reward countdown in footer 2023-07-06 12:43:51 -05:00
ekzyis 37e70f9791
Scroll to items on push notification click (#345)
* Scroll from root item in reach on notification click

Instead of going directly to the item of the notification, we now scroll from the root item which is still in reach to the comment.

This should provide more context to the user in most cases.

* Also scroll from root item in reach in /notifications

---------

Co-authored-by: ekzyis <ek@stacker.news>
2023-07-06 10:00:38 -05:00
ekzyis 57f3ad1c75
Fix darkmode in walkthrough popover (#343)
* Fix darkmode in walkthrough popover

* Fix invalid DOM property `class`

---------

Co-authored-by: ekzyis <ek@stacker.news>
2023-07-05 15:07:18 -05:00
keyan 09d7e960cc back to lightning animation 2023-07-05 09:47:44 -05:00
keyan dc62751df4 dont show push notifications in nonsupporting browsers 2023-07-04 18:44:03 -05:00
keyan 19c743f70d fix safari notifications error 2023-07-04 18:02:22 -05:00
keyan a17b4d1f1a refine push notification ui and catch promises 2023-07-04 17:19:59 -05:00
keyan 3068252adf merge github master 2023-07-04 15:35:04 -05:00
ekzyis 30cc42109f
Fix different font between write and preview (#338)
Co-authored-by: ekzyis <ek@stacker.news>
2023-07-04 14:36:55 -05:00
ekzyis 40ef4f47c8
Remove unused var (#330)
Co-authored-by: ekzyis <ek@stacker.news>
2023-07-04 14:36:38 -05:00
ekzyis 388e00dd04
Service worker rework, Web Target Share API & Web Push API (#324)
* npm uninstall next-pwa

next-pwa was last updated in August 2022.
There is also an issue which mentions that next-pwa is abandoned (?): https://github.com/shadowwalker/next-pwa/issues/482

But the main reason for me uninstalling it is that it adds a lot of preconfigured stuff which is not necessary for us.
It even lead to a bug since pages were cached without our knowledge.

So I will go with a different PWA approach. This different approach should do the following:
- make it more transparent what the service worker is doing
- gives us more control to configure the service worker and thus making it easier

* Use workbox-webpack-plugin

Every other plugin (`next-offline`, `next-workbox-webpack-plugin`, `next-with-workbox`, ...) added unnecessary configuration which felt contrary to how PWAs should be built.
(PWAs should progressivly enhance the website in small steps, see https://web.dev/learn/pwa/getting-started/#focus-on-a-feature)

These default configurations even lead to worse UX since they made invalid assumptions about stacker.news:
We _do not_ want to cache our start url and we _do not_ want to cache anything unless explicitly told to.
Almost every page on SN should be fresh for the best UX.

To achieve this, by default, the service worker falls back to the network (as if the service worker wasn't there).

Therefore, this should be the simplest configuration with a valid precache and cache busting support.

In the future, we can try to use prefetching to improve performance of navigation requests.

* Add support for Web Share Target API

See https://developer.chrome.com/articles/web-share-target/

* Use Web Push API for push notifications

I followed this (very good!) guide: https://web.dev/notifications/

* Refactor code related to Web Push

* Send push notification to users on events

* Merge notifications

* Send notification to author of every parent recursively

* Remove unused userId param in savePushSubscription

As it should be, the user id is retrieved from the authenticated user in the backend.

* Resubscribe user if push subscription changed

* Update old subscription if oldEndpoint was given

* Allow users to unsubscribe

* Use LTREE operator instead of recursive query

* Always show checkbox for push notifications

* Justify checkbox to end

* Update title of first push notification

* Fix warning from uncontrolled to controlled

* Add comment about Notification.requestPermission

* Fix timestamp

* Catch error on push subscription toggle

* Wrap function bodies in try/catch

* Use Promise.allSettled

* Filter subscriptions by user notification settings

* Fix user notification filter

* Use skipWaiting

---------

Co-authored-by: ekzyis <ek@stacker.news>
2023-07-04 14:36:07 -05:00
keyan 3d093d45f3 small fireworks changes 2023-07-03 19:04:07 -05:00
keyan b6628eb159 july 4th festivities 2023-07-03 14:46:54 -05:00
ekzyis eac73e7169
Fix double submit (#328)
Co-authored-by: ekzyis <ek@stacker.news>
2023-06-23 10:21:29 -05:00
ekzyis fa32e22cde
Fix double slash (#325)
Co-authored-by: ekzyis <ek@stacker.news>
2023-06-21 13:09:04 -05:00
keyan 431947eeee different freebie rules 2023-06-20 12:55:45 -05:00
keyan 03e0646560 ~meta sub 2023-06-20 11:27:41 -05:00
keyan 747371a4e4 snl live banner 2023-06-20 09:57:06 -05:00
keyan 3e4161ae8c tip -> zap 2023-06-19 13:21:55 -05:00
keyan f8724f75e7 add tab shortcut and better resulting selection ranges 2023-06-19 13:07:06 -05:00
ekzyis b427c921d1
Add SimpleX group invite to footer (#320)
Co-authored-by: ekzyis <ek@stacker.news>
2023-06-16 18:04:56 -05:00
keyan 02ec14549f prevent markdown input cursor from moving 2023-06-13 09:19:50 -05:00
keyan 73bb4a0141 change more post types copy 2023-06-12 19:43:08 -05:00
keyan f0f51438c4 add top posts/comments to subs 2023-06-12 19:40:18 -05:00
keyan 6ed2c87c49 fix ssr and client side rendering difference warnings 2023-06-12 17:59:53 -05:00
keyan ef533d41a6 move markdown related code to proper component 2023-06-12 17:39:20 -05:00
keyan 6a49f37c68 only honor selection range in textarea 2023-06-12 17:21:13 -05:00
keyan 5958875f1e wait for comments to collapse before scrolling 2023-06-12 16:03:32 -05:00
keyan ab3b24a072 refine pwa back button 2023-06-12 15:49:48 -05:00
keyan ed938527fd simply respect notification alert message 2023-06-12 15:37:12 -05:00
keyan d78c98e701 improve rss footer 2023-06-12 14:48:35 -05:00
keyan 342a165ced refine cancel button 2023-06-12 14:39:27 -05:00
keyan 79df6b2be2 prevent default on all markdown shortcuts 2023-06-12 13:49:58 -05:00
ekzyis 069417d130
Enable push notifications in settings (#301)
* Enable push notifications in settings

* Fix checkbox still checked after user denied permission

The error was related to me thinking that the value prop does anything. It didn't.
The value of the checkbox is handled by formik.
So the solution was to hook into formik and use the handler which actually changes the value.

* Add double opt-in to /notifications

* Better styling of alert in /notifications

---------

Co-authored-by: ekzyis <ek@stacker.news>
2023-06-12 13:03:44 -05:00
ekzyis b890215b98
Tech sub (#311)
* Add tech sub

* Fix line break in RSS popover

---------

Co-authored-by: ekzyis <ek@stacker.news>
2023-06-12 12:41:22 -05:00
ekzyis e243c1c224
Add cancel button for editing all post types + bio (#310)
* Add cancel button when editing any post type

* Add cancel button when editing bio

---------

Co-authored-by: ekzyis <ek@stacker.news>
2023-06-12 12:35:28 -05:00
ekzyis 393d4c7603
Add Markdown formatting hotkeys: CTRL+K, CTRL+I, CTRL+B (#305)
* Fix usage of deprecated event.keyCode

* Add CTRL+K to insert markdown link formatting

* Also add CTRL+B and CTRL+I

* Fix undo not working after using setValue

Undo doesn't work if inputs are changed using javascript code like helpers.setValue().

The solution is to also use `document.execCommand()`.

See https://stackoverflow.com/questions/27027833/is-it-possible-to-edit-a-text-input-with-javascript-and-add-to-the-undo-stack

However, `document.execCommand()` is deprecated but there seems to be no alternative, see:

- https://stackoverflow.com/questions/60581285/execcommand-is-now-obsolete-whats-the-alternative
- https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand#browser_compatibility
- https://github.com/codex-team/editor.js/discussions/2214

And so far, every browser still seems to support it: https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand#browser_compatibility

---------

Co-authored-by: ekzyis <ek@stacker.news>
2023-06-12 12:29:50 -05:00
keyan 369bd82a84 make freebie comments visible case by case 2023-06-03 20:01:50 -05:00
keyan 56f08e0144 allow ctrl-click of post button 2023-06-03 17:49:04 -05:00
keyan d815cae715 add 'stacking since' to profile 2023-06-02 19:55:45 -05:00
keyan d4988694c8 make room in header to pwa back button 2023-06-01 19:34:26 -05:00
keyan 56314bac4e fix window navigation error on firefox 2023-06-01 15:29:20 -05:00
keyan c4b96b998f only request notification permissions on the notifications page 2023-06-01 14:41:20 -05:00
keyan f4b81b0ff0 fix notification clicking after refactor 2023-06-01 13:22:39 -05:00
keyan 3de8df5ab5 enhancements for footer version with prod support 2023-06-01 12:57:31 -05:00
ekzyis 61e0a100c0
Show version in footer (#294)
Co-authored-by: ekzyis <ek@stacker.news>
2023-06-01 12:19:45 -05:00
keyan 15850f0dbb move free posts message about sub select 2023-05-31 19:54:35 -05:00
ekzyis 40b7fde621
refactor: create component per notification type (#298)
Co-authored-by: ekzyis <ek@stacker.news>
2023-05-31 19:51:30 -05:00
ekzyis 0c251ca376
Add thread subscriptions (#293)
* Add thread subscriptions

* remove dead code: reply only notifications

* break out thread subscription queries to reduce search space

* one db dip for item lists/threads re:meSubscription

---------

Co-authored-by: ekzyis <ek@stacker.news>
Co-authored-by: keyan <keyan.kousha+huumn@gmail.com>
2023-05-31 19:44:06 -05:00
ekzyis e97509eea7
Use PWA with display: standalone (#292)
* Use next-pwa

* Use standalone + back button

* Use Notification API

* Use custom service worker

* Use url_handlers

* Add offline page

* Use smaller icon in notification

* Only prompt for notifications if logged in

* small enhancements to standalone pwa

* remove unused back arrow

---------

Co-authored-by: ekzyis <ek@stacker.news>
Co-authored-by: keyan <keyan.kousha+huumn@gmail.com>
2023-05-31 17:28:33 -05:00
ekzyis 5c55afc97c Fix no dupes check after link unshortening 2023-05-21 12:50:14 -05:00
ekzyis 4af445d242 Fix fetched data not shown if last action was title clear
There are two flows when clearing both inputs:

1. First clear title, then clear URL, then enter new URL

In this case, new data will be fetched when the URL is cleared since the title is empty. Due to the fetch with empty variables, the fetched data is essentially reset.
Entering a new URL thus triggers a new fetch (since title is still empty) and the fetched data is shown since it is different compared to the previous render.

2. First clear URL, then clear title, then enter new URL

In this case, new data will not be fetched when the URL is cleared since the title is not empty.
When entering a new URL, new data is fetched but will not be shown since the fetched data was never reset and thus did not change compared to the previous render.

This is fixed by always either a) resetting the fetched data or b) fetching new data if the URL changed.
2023-05-21 12:27:01 -05:00
keyan 87e86526f8 fix submit button not being disabled 2023-05-18 13:02:19 -05:00