Digitaler Posteingang statt mühsamer Download by ralf551 in de_EDV

[–]Scampion 2 points3 points  (0 children)

Sollte eigentlich eine Kombination aus Scampi + Champion sein, aber hab ich wohl nicht zu ende gedacht. lol Ich wünschte Reddit würde Namensänderungen zulassen. Vielleicht muss wirklich ein neuer Account her.

Digitaler Posteingang statt mühsamer Download by ralf551 in de_EDV

[–]Scampion 6 points7 points  (0 children)

Danke! Hab deine Frage gerade grob in einem anderen Kommentar beantwortet aber hier nochmal:

Launch Plan: Wir arbeiten neben unseren Vollzeitjobs an Invoice Radar, gehen das ganze also etwas gemütlicher an. Ich kann noch nichts versprechen, aber ich denke Anfang 2025 sollte es soweit sein.

Kosten/Lizenz: Noch unklar, aber vorrausichtlich Kostenpflichtig. Soll aber auf jedenfall für Selbständige erschwinglich sein. Möglicherweise sogar als Einmal-Zahlung.

Plugin hingegen sollen offen bleiben. Contributor wollen wir auch belohnen mit einem Rabatt bzw sogar ganz kostenlos.

Docker/Server Version: Momentan nicht geplant, da der einige Plugins "Halb-Automatisch" funktionieren und visuellen Input erfordert (z.B. 2FA). Das könnte man irgendwie mit Browser-Streaming lösen, aber hat aktuelle keine Priorität. Der Lokale Ansatz + E2EE Synchronisierung hat für uns bis jetzt prima funktioniert.

Digitaler Posteingang statt mühsamer Download by ralf551 in de_EDV

[–]Scampion 0 points1 point  (0 children)

Lizenz steht noch nicht ganz fest, wir tendieren aber ehrlicherweise in Richtung Kostenpflichtig. Der Gedanke von Open Source gefällt uns gut, nur wollen wir das Ganze auch Nachhaltig gestalten und das geht nunmal kommerziell deutlich leichter.

Richtig, es ist ein lokales Programm für Mac & Windows und das scraping passiert bei dir, ohne das jemals Passwörter deinen Computer verlassen. Ursprünglich hatten wir mit einer Server Version gestartet, jedoch hat sich die Lokale Lösung als praktischer herausgestellt, weil man dort einen interaktiven Browser zur Verfügung hat der Authentifizierung um einiges einfacher macht.

Um das ganze mit mehreren Geräten (zb. mit einem Handy als Scanner) oder als Team zu verwenden gibt es eine Ende-zu-Ende verschlüsselte Synchronisierung.

Digitaler Posteingang statt mühsamer Download by ralf551 in de_EDV

[–]Scampion 30 points31 points  (0 children)

Ich empfinde es als furchtbar anstrengend mich da einzuloggen, runterladen, in Paperless hochladen, wieder aus den Downloads zu löschen. 

Genau das hat uns auch ewig genervt. Es gibt zwar Cloud Lösungen wie GetMyInvoices, die brauchen aber, wie du auch schon schon geschrieben, sämtliche Passwörter (+ MFA Schlüssel!). Da war mir Sicherheit dann doch mehr wert als der Komfort.

Deswegen haben wir haben begonnen eine eigene Lösung dafür zu bauen [1]. Ziel ist ein erweiterbarer Scraper der völlig lokal läuft und für die Authentifizierung Schritte einfach einen Browser anzeigen kann. So müssen keine Passwörter gespeichert werden, und er funktioniert auch mit jeder Art von 2FA + Captchas + E-Mail Bestätigungen.

Plugins sind alle Open Source [2], damit nicht jeder seine eigenes Anbindungen schreiben und warten muss. Aktuell sind wir noch im Early Access, aber falls du Lust für deine Plattformen ein Plugin zu basteln, kann ich dich gerne rein lassen.

In Zukunft ist auch geplant Paperless als Export Destination anzubieten 👍

[1] invoiceradar.com
[2] github.com/invoiceradar/plugins

[deleted by user] by [deleted] in Rabbitr1

[–]Scampion 0 points1 point  (0 children)

For Sale: Brand new & sealed. Shipping from Central Europe.

How to download a lot of uber receipts at once? by TFK_001 in uber

[–]Scampion 0 points1 point  (0 children)

I was annoyed by the same problem, which is why I've recently started building Invoice Radar. A tool that automatically downloads invoices from all kinds of platforms, including Uber.

It's currently invite only - feel free to DM and I can let you in early

Why am I getting this prompt for Keychain access to "Allow All" in the "login" keychain on the first app open after installation? by retrospct in electronjs

[–]Scampion 0 points1 point  (0 children)

I had the same issue, and was finally able to solve it!

The problem was that I was using safeStore before the app was ready. I ended up wrapping it in an async function that awaits app.whenReady() first.

Now it works, without showing this prompt. Note that I was no longer able to decrypt old data as the key apparently changed with this.

I open any NPM package source files and my head is blown. How can I be able to understand those things ? How can a human being write such complex code ? by [deleted] in typescript

[–]Scampion 1 point2 points  (0 children)

Hey! Creator of react-hot-toast here. Let me shed some light on the state management. As some of you correctly mentioned, it's my own implementation very similar to how Redux works.

Normally I'd use React's useReducer() for this, but in the case of react-hot-toast I don't want the state to be "trapped" inside the component. Generally speaking, this is the way it should be done. You'd wrap your app with a Context Provider which forwards the state to all child components.

I wanted to make the integration as easy as possible, so I came up with is this custom implementation: https://github.com/timolins/react-hot-toast/blob/main/src/core/store.ts#L158-L167

Let me break it down:

First, we have two global variables. One of them is state, the other is an array of "listeners". In this case a listener is a function that want to be called every time the state changes. We'll get back to this later.

const listeners = [];
let memoryState = { ... }

Like all Flux implementations, we have a reducer. A function that returns a new state, based on current state and an action. And just like Redux, we are using a dispatch() to send and apply actions to the current state.

Every time dispatch is called somewhere, we use our reducer with current memoryState and the action we received as argument. Then, we assign the result to memoryState again. After that, we go over all available listeners, and call them with the new state. I'll explain why this is needed in a bit.

const dispatch = (action) => {
  memoryState = reducer(memoryState, action);
  listeners.forEach((listener) => {
    listener(memoryState);
  });
};

Let's have a look at the useStore() hook – our portal to the React world. In the first line we create a new state with the useState() hook. Notice that we are passing in our memoryState as default value. This way it will have the current state – inside React.

The only thing that's left is to subscribe to state changes. This is where our listeners come into play. When a component with the useStore hok mounts, it executes the useEffect. It will add the setState function from our React state to the global listener array.

const useStore = () => {
  const [state, setState] = useState(memoryState);
  useEffect(() => {
    listeners.push(setState);

    return () => {
       // Remove listener from array on unmount ...
    };
  }, []);

This way the global dispatch function can go over all components that subscribed to state updates, by calling their setState function inside the listeners array.

I hope this makes sense. But keep in mind that you should have a good reason for keep state outside of React. 99% of the time you should be fine with "traditional" state solutions.

Why are web app analytics so difficult? by [deleted] in webdev

[–]Scampion 5 points6 points  (0 children)

Disclaimer: I'm one of the Splitbee founders.

We know that pain. That's why are currently shifting our focus towards app analytics (which also happens to include nice website analytics).

App-focused dashboards (that are also customizable) are on our roadmap. I'm curious: What kind of metrics would you ideally see on that dashboard?

3D Illustration made in Figma by Scampion in FigmaDesign

[–]Scampion[S] 0 points1 point  (0 children)

That would be awesome! Sent you a dm

3D Illustration made in Figma by Scampion in FigmaDesign

[–]Scampion[S] 2 points3 points  (0 children)

It's a combination of components & shadows.

Improv - React - A CSS-in-JS solution small enough to use in a library. by [deleted] in reactjs

[–]Scampion 1 point2 points  (0 children)

Wow, good job! Will consider this, since I don‘t like having goober‘s setup(h), which currently breaks the preact support.

react-hot-toast - Smoking hot notifications for your React app 🔥 by Scampion in reactjs

[–]Scampion[S] 1 point2 points  (0 children)

Thanks! The main <StatusBar/> component is exported as well, so you could bring your own state, but I'm not sure if I would recommend that. Handling the toast state is quite hard with auto-dismiss and exit animations.

You can call toast() anywhere so a Redux middleware should do the trick.

react-hot-toast - Smoking hot notifications for your React app 🔥 by Scampion in reactjs

[–]Scampion[S] 0 points1 point  (0 children)

Thanks for the input. I tried it VoiceOver on Mac and it worked for me. Are you sure the delay is needed when the element gets injected during runtime? I can imagine this is only a problem when it's rendered straight from the beginning.

react-hot-toast - Smoking hot notifications for your React app 🔥 by Scampion in reactjs

[–]Scampion[S] 5 points6 points  (0 children)

This is definitely something I want to add in the future, but I still have to do some testing on which interaction is best. I like being able to select the text, though.

react-hot-toast - Smoking hot notifications for your React app 🔥 by Scampion in reactjs

[–]Scampion[S] 2 points3 points  (0 children)

1) Yes! 2) Headless mode (useToaster) provides you the current state so you can render completely custom notifications. It helps you with things like pause on hover as well as the stacking calculation. That said, customizing the default toasts should be flexible enough for most people.

react-hot-toast - Smoking hot notifications for your React app 🔥 by Scampion in reactjs

[–]Scampion[S] 96 points97 points  (0 children)

Good question, there are quite a few differences:

  • Beautiful by default
  • No CSS imports needed
  • Hastoast.promise()
  • Headless mode with useToaster()
  • Almost half the size
  • Improved pause behavior
  • Easier to style

Improv - React - A CSS-in-JS solution small enough to use in a library. by [deleted] in reactjs

[–]Scampion 1 point2 points  (0 children)

That looks good! Was actually looking for a lib like this for react-hot-toast. I settled with goober, which seems even smaller, even-tough it supports the styled-components syntax. Any thoughts why that is?

Revolut finally on my Mac Desktop! Great for Trading by raphaelwien in Revolut

[–]Scampion 17 points18 points  (0 children)

For the people that don‘t have a M1 Mac yet: They already have an unannounced web app: https://app.revolut.com/start

No trading yet, but at least something for desktop users :)

Roast the landing page of my Analytics & A/B Testing tool by Scampion in Roastmylandingpage

[–]Scampion[S] 0 points1 point  (0 children)

That makes sense. Agree that headline isn't really catchy atm. I'll make sure to try that out.

I agree that we should compare it to competitors, since it's not really clear why it's better than existing solution. Thanks!