Projekt aplikacji SaaS
8 godz. 8 min · Next.js · Full-stack i Programowanie
Daniel NoworytaFull stack DeveloperNaucz się tworzyć bezpieczne systemy uwierzytelniania i autoryzacji, korzystając z Clerk. Pokażę Ci, jak to robić krok po kroku, aby Twoje aplikacje były bezpieczne i profesjonalne.
Zrozumiesz, jak skutecznie i bezboleśnie połączyć swoją aplikację Next.js z bazą danych PostgreSQL na DigitalOcean. Pokażę Ci, jak używać Prismy, aby ułatwić ten proces.
Dowiesz się, jak zarządzać routingiem i nawigacją w swojej aplikacji, aby użytkownicy mogli łatwo i intuicyjnie poruszać się po Twojej stronie.
Pokażę Ci, jak z łatwością wdrożyć swoją aplikację na Vercel, jednym z najpopularniejszych środowisk hostingowych dla aplikacji Next.js.
Nauczysz się zarządzać stanem aplikacji i jak wykorzystać server actions w praktyce, co pozwoli Ci na tworzenie bardziej zaawansowanych i dynamicznych funkcji.
Ten kurs jest dla osób, które już mają pewne doświadczenie z JavaScript i chcą zgłębić swoje zrozumienie Next.js. Zakładamy, że znasz podstawy TypeScript, TailwindCSS, ale nie potrzebujesz doświadczenia z Next.js - wszystko wyjaśnię Ci od podstaw!
Teraz, kiedy mamy już
jakiś w miarę dobrze wyglądający formularz, tutaj możemy zająć się
podpięciem naszej logiki do dodawania naszych nowych subskrypcji i tym, żeby
nasza tabelka odpowiednio aktualizował się.
Zaczniemy od tego, że stworzymy sobie kontroler komponent jeżeli chodzi o te
wszystkie importy, czyli potrzebujemy stanu.
Jeżeli chodzi o te wszystkie importy, czyli myślę, że dobrym pomysłem tutaj
będzie wyciągnięcie tak naprawdę tego komponentu.
Jeżeli chodzi o ten guzik dodawania nowej
subskrypcji, wyciągniemy go sobie na zewnątrz jako nowy komponent.
Po prostu będziemy sobie go tutaj używać,
bo tutaj jeżeli zaczniemy wpisywać tam całą logikę.
Myślę, że generalnie API user button to nie jest odpowiednia nazwa też do miejsca
na tę logikę także stworzymy sobie w tym momencie nowy komponent.
Natomiast jeszcze zanim za to, zanim zaczniemy zalecam Ci zainstalowanie
sobie rozszerzenia, mianowicie inline fold.
I to jest rozszerzenie, które pomaga.
Lepiej. Pracować z talią inne.
No bo to co tutaj mamy.
Jeżeli sobie zobaczysz, że jeżeli ja sobie zrobię teraz wrap wrap Toggle workshop,
zobacz, że te klasy zaczynają być po prostu mało czytelne, prawda?
Dlatego też zachęcam Cię serdecznie do zainstalowania sobie inline fold.
Ja sobie teraz to włączę w mojej tutaj w moim edytorze kodu i zobacz w tym momencie
klasy, które tak naprawdę były nieczytelne, stają się czytelne.
Mogę sobie tutaj kliknąć do środka i tak
naprawdę w każdym momencie mogę sobie edytować tą klasę.
Jeżeli wejdę no to mam tylko tutaj.
Czy kropeczki czytaj mój plik staje się dużo bardziej czytelny.
Także zachęcam Cię serdecznie do zainstalowania sobie
tego rozszerzenia jeszcze raz i może pokaże Install Extensions.
To jest rozszerzenie o nazwie inline fold autorstwa Mohammeda Mori.
Przejdźmy teraz sobie do naszego nowego komponentu.
Będziemy potrzebowali tak naprawdę nowy komponent tutaj sobie stworzyć.
Będzie to Add subskrypcją Button.
Myślę, że to będzie lepsza nazwa dla tego,
co my tutaj sobie razem w tym momencie robimy.
Także add subskrypcję BTN.
Możemy zrobić X.
I tutaj export.
Default function in btn.
To będzie zwyczajna funkcja return.
Zwrócimy ten nasz dialog. Tak.
To co mamy. Tutaj?
Możemy tak naprawdę wziąść całość tutaj, skopiować albo wyciąć i wkleić.
Tu to tutaj w tym miejscu.
Zapiszemy sobie.
Oczywiście trzeba teraz tutaj nasze importy
przenieść w odpowiednie miejsce, czyli przeniesiemy sobie ten import do nowego
komponentu, zapiszę i już nie mam żadnego błędu.
I tutaj możemy już wykorzystać add on button nasz nowy komponent.
Generalnie rzecz biorąc nic się nie powinno zmienić w wyświetlaniu
naszego komponentu i to też cały czas tutaj ten komponent się wyświetla dobrze.
Przejdźmy teraz do naszego Association Button i tutaj zaczniemy sobie
budować logikę naszego formularza naszego komponentu.
Potrzebujemy stany.
Tak naprawdę potrzebujemy stany na.
Każdy z tych importów także rozpoczniemy od name czyli const name.
Set name. Jest równy.
Juz.
Stad i jako domyślną wartość zrobimy sobie
empty string za Importujemy nasz wstyd i prawdopodobnie
dostaniemy błąd tutaj z tego względu, że mamy
jeszcze nie używamy stanu, natomiast to też musi być komponent po stronie klienta,
także już możemy sobie to od razu już client zaaplikować w tym momencie i już.
To jest komponent po stronie klienta,
także spokojnie będziemy mogli sobie używać naszego stanu.
Dobrze, Jeżeli chodzi o name. I.
Name to zwróćmy się tutaj do naszego do naszej form.
I. Tutaj mamy label.
Input. Input, typ text i name.
To zróbmy sobie. Value, niech to będzie name.
I standardowo tutaj mamy event,
event, set name i target Baju.
W tym momencie jak będziemy tutaj wpisywać
jakąkolwiek wartość netto, tak naprawdę nasz status zostaje
aktualizowany i to sobie przechwytuje dobrze.
Kolejna rzecz, którą potrzebujemy to kategorie, czyli const i osobny stan.
Category Set Category.
I tutaj.
Jeżeli chodzi o kategorię to możemy sobie zostawić jako.
Empty String.
Wróćmy teraz do importu do SELECT a jeżeli
chodzi o nasze kategorie i musimy tutaj po prostu podpiąć naszą
logikę jeżeli chodzi i logikę związaną z kategoriami, czyli select.
Tutaj będzie miał value i tym value będzie category.
I on ciągle.
Tutaj będziemy mieli event i set kategorii.
Target Vario.
Jako że tutaj mamy problem, bo target pewnie pokaże nam, że nie jest undefined.
Zróbmy, sprawdźmy o co tutaj chodzi i możemy na sztywno podać jako wartość.
Możemy sobie zrobić tak naprawdę z
kategorii nie mamy naszego użytkownika, musielibyśmy je pobrać z backendu.
Także możemy na chwilę obecną tak naprawdę zrobić stream.
Jeżeli mielibyśmy jakieś opcje użytkownika to jak najbardziej moglibyśmy sobie tutaj
użyć pobrać te kategorie, które nasz użytkownik dany zalogowany użytkownik ma
w swoim systemie i jako możliwą wartość do wyboru moglibyśmy tutaj dać kategorię.
Natomiast jako że pozwalamy tworzyć
użytkownikowi nową subskrypcję z obojętnie jaką kategorią, także myślę, że może tu
być obojętnie jakiś string tak naprawdę jako value.
My tutaj bardziej.
Jakby ważne byłoby to, jeżeli chodzi o pole kategorii, które mamy tutaj.
Myślę, że dużo ważniejsze byłoby to tutaj odczytywanie tego, co nasz użytkownik ma w
swoich opcjach, żeby wyświetlać odpowiednie opcje.
My na chwilę obecną mamy Entertainment
Instruments, natomiast myślę, że tutaj powinna być spięta logika, która odczytuje
kategorie, które dany użytkownik ma zdefiniowane w swojej aplikacji.
Czyli tu mamy już.
Myślę, że kategorie mamy załatwione.
Przechodzimy dalej.
Następnym polem jest avatar URL.
Czyli const i avatar.
URL set avatar world.
I tu ty też sobie zrobimy.
Juz możemy sobie od razu zrobić to jako string i jako domyślną wartość.
Mam przygotowany adres
avatara dla google, żebyśmy nie musieli tego po prostu wpisywać przy testach.
Tego to już wkleję tutaj.
Już w tym momencie jak sobie podepniemy tą wartość avatar URL do naszego importu.
Z.
Avatar URL em to powinniśmy tak naprawdę
dostać naszą wartość, czyli znajdźmy sobie ten input.
Avatar URL nie są tutaj i możemy sobie tutaj użyć jako.
Value avatar url i.
Możemy sobie zrobić po prostu standardowo.
Event i set.
Avatar i URL jako.
Event target value.
Zapiszemy to sobie już jako tworzymy nasz komponent.
To już mamy domyślnie. Tutaj.
Wrzucony adres naszego awatara.
Myślę, że to możemy sobie tak zostawić tak jak jest teraz.
Przejdźmy teraz do kosztów, czyli do stanu związanego z kosztem.
Możemy tak naprawdę nazwać.
Zostawmy te nazwy.
Myślę, że Price byłaby tu może bardziej odpowiednia nazwa.
Natomiast zgodnie z nazewnictwem tych pól zostawimy sobie cost, czyli seat cost.
I tu równa się to będzie typu.
Myślę, że Amber jako domyślny stan możemy sobie dać zero.
Czyli przejdźmy do.
KOD. Tutaj mamy ten.
Input. Typu number i tutaj.
Kowalu podamy sobie kostki i jako on podamy sobie event i set koszt.
I Target Vario.
Sprawdźcie sobie dlaczego teraz.
Tutaj.
String jest nasrane bo.
Sprawdźmy, czy my tu mamy string.
Nie możemy wykorzystać coś takiego.
Prawdopodobnie musimy sobie zrobić parę.
I możemy zamknąć to w nawias.
Już w tym momencie mamy. Niejako.
Numer, czyli otwórzmy.
Mamy koszt domyślnie ustawiony jako.
Jako number.
Natomiast musimy zwrócić uwagę na miejsca po przecinku.
Dlatego myślę, że to rozwiązanie z polskim tutaj nie jest za bardzo fortunne.
Zróbmy inną logikę zróbmy najpierw const value i tutaj sobie zrobimy parser float.
Tak naprawdę musimy sprawdzić tutaj.
Jaki jest i target value.
I możemy sobie też zrobić taką walidację, że jeżeli if.
Jest nan.
I nasz value.
Czyli jeżeli nasz walił jest liczbą, no to możemy sobie zrobić set.
Cost.
I wpisać nasze wania.
Natomiast jeżeli chodzi o to, to tutaj będziemy potrzebowali.
2 miejsc. Po przecinku.
Czyli możemy sobie zrobić Polską.
I tu fixed do dwóch miejsc po przecinku.
To możemy usunąć.
Musimy zamknąć nawias.
I zapisujemy nasze zmiany.
Już możemy teraz tutaj wpisywać wartości
po przecinku i nie ma z tym żadnego problemu.
Kolejną rzeczą, którą musimy sobie zrobić
to tutaj obsługa billing period, czyli przechodzimy do naszych stanów.
Mamy Aviator, mamy koszt.
Poniżej jeszcze potrzebujemy kontrolę na billing.
Czyli Billing period.
Set billing period.
I tutaj ostatni.
I tu możemy sobie ustawić jako state jako string.
Typ. I myślę, że domyślne wartości na razie
sobie nie będziemy tutaj wrzucać albo wrzucimy sobie.
Tak naprawdę możemy sobie wrzucić Billing period monthly
i od razu sobie sprawdzimy tutaj w jaki sposób mamy nasze wartości
przekazywane i myślę, żeby tutaj troszeczkę bezpiecznie
było, to możemy wykorzystać od razu skryptem billing period i.
Tutaj w tym. Momencie będzie Monthly.
Jeżeli chodzi o następne wartości.
To musimy tutaj wykorzystać subskrypcję Billing Period.
Tu jest quarterly i subskrypcja Billing period.
Jeśli tak, mamy miesięcznie.
Kwartalnie i rocznie i to możemy sobie ustawić jako opcję Selected.
Jest to opcja domyślna.
No i tworzymy tutaj nasz i mamy domyślną opcję Selected jako
monthly, czyli użytkownik tak naprawdę nie musi tego wybierać.
Nie mamy tutaj jako domyślny pola, które wymagamy.
Jest to domyślnie wybrane za użytkownika.
Kolejna rzecz to mamy naszą date, czyli Next Payment, czyli connect.
Next payment i set next payment. I juz.
Stad jako typ.
Możemy zrobić string.
Tak naprawdę zapiszemy go.
Wróćmy do naszego pola Experiment, gdzie mamy pole na eksperyment.
Mamy tutaj typ Input Date.
Musimy tutaj kilka rzeczy wprowadzić.
Na pewno value potrzebujemy next payment.
Na pewno będziemy potrzebowali tutaj
może minimum value, bo nie chcemy, żeby payment był w przeszłości.
Jeżeli ktoś dodaje swoją subskrypcję.
Zakładamy, że po prostu
albo ją dzisiaj rozpoczyna w momencie, w którym ją dodaje.
Czyli jeżeli chodzi o minimum date.
Jeżeli chodzi o next payment
to możemy tutaj użyć format date i w tym momencie wykorzystamy New.
Date i jako.
Format rok rok. W.
Rok taki jak mamy napisany w naszym imporcie.
DD.
W tym momencie jest jak najbardziej ok i musimy sobie ustawić, że to będzie event.
Ileś set next payment ustawimy na i targetowania.
Zapisujemy to sobie. Sprawdźmy teraz jak działa nasz komponent.
Mamy eksperyment, mamy minimum.
Wallu, czyli jeżeli otworzymy
nasz kalendarz, no to wiadomo, nie możemy wybrać wartości, która była w przeszłości.
Myślę, że to jest w porządku jak na razie
na tą logikę i jeżeli chodzi o stan to myślę, że mamy wszystko.
Spróbujmy sobie teraz wylogować.
Czy rzeczywiście te wartości zostają uaktualnione?
Czyli name potrzebujemy kategorii avatar URL.
Dodatkowo koszt billing period.
Zapiszę to sobie teraz.
Zrobimy sobie tutaj Console log,
sprawdzimy sobie wartości, zmienimy sobie name np.
na Netflix.
Sprawdźmy nasze wartości powiedziałam no
name, wprowadziliśmy na Netflix i jest wszystko w porządku.
Billing mamy na monthly jako domyślnie avatar URL też jest ustawiony.
Domyślnie kategoria jest undefined, czyli
tutaj też możemy sobie pomyśleć o domyślnie wybranej kategorii.
Jeżeli chodzi o nasze kategorie, możemy
sobie tutaj tak naprawdę na sztywno wpisać entertainment.
Wiadomo, że w produkcyjnej aplikacji
chcielibyśmy raczej mieć mapowanie kategorii, które użytkownik ma
natomiast wrzucając tutaj do naszej kategorii.
Jeżeli chodzi o nasz select to wywalił Entertainment zrobimy jako sealed
selected, żeby był domyślnie wybrany w naszym polu.
Czyli teraz jak sobie zamkniemy nasz.
Input i wpiszemy Netflix.
To tutaj Teraz mamy już kategorię Entertainment.
Domyślnie koszt 0 i Netflix.
Dobrze, Myślę, że. To.
Byłoby na tyle.
Podpięcie stanu pod nasz nasz formularz mamy za sobą.
Teraz przejdziemy do funkcji, która będzie dodawała.
Nową subskrypcję. Do naszego serwera.