Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

457 fe content panel edit blog fixes new branch #469

Closed
Closed
Changes from 30 commits
Commits
Show all changes
348 commits
Select commit Hold shift + click to select a range
83cc1c1
Initial version
petark7 Jul 9, 2024
9518f6f
Added sign in and sign out button
MarijaTrajkoska Jul 9, 2024
25e6991
Corrected cursor in the table, .map in TableRowComponent.tsx
aleksandarmicev Jul 9, 2024
f87174a
fix eslint errors
aleksandarmicev Jul 9, 2024
6f836ee
made interface for passwordValidation,defined object ruleMessage,chec…
Mario-k4 Jul 10, 2024
ba7644e
Refactor code
petark7 Jul 10, 2024
1b3ca17
added new prop to opionaly show checkboxes and integrated generics to…
Mario-k4 Jul 10, 2024
9ad8bda
resolved conflicts
Mario-k4 Jul 10, 2024
f749a31
made the action button active,removed fetchdata,and removed displayNa…
Mario-k4 Jul 10, 2024
6e86578
removed content from admin-dashboard
Mario-k4 Jul 10, 2024
88eb187
removed confirmation modal
Mario-k4 Jul 10, 2024
0672242
removed use client from admin-dashboard
Mario-k4 Jul 10, 2024
ce809f3
removed userData interface
Mario-k4 Jul 10, 2024
05396b1
Merge pull request #412 from learnhubmk/reusable-table
edichoska Jul 10, 2024
7001a18
Merge pull request #401 from learnhubmk/sign-up-page-design
edichoska Jul 10, 2024
321a687
Merge branch 'staging' into #358-Tags-Page-View
petark7 Jul 11, 2024
603168a
Implement Tags page view with reusable components: reusable-table, input
petark7 Jul 13, 2024
a7e6c21
PR Improvements
petark7 Jul 14, 2024
79e3d8d
Fix typescript issues
petark7 Jul 14, 2024
9fa14e9
Merge pull request #421 from learnhubmk/#358-Tags-Page-View
edichoska Jul 14, 2024
2f25a7f
initial commit
Mario-k4 Jul 14, 2024
83424e5
added login /login route, created SignIn component and set up js-cookie
stefanatanasovmk Jul 15, 2024
8e4a579
changed Referer value in getCsrf function in login component
stefanatanasovmk Jul 15, 2024
9a6ae3a
Implement Add Tag functionality
petark7 Jul 15, 2024
73ed7fb
Update page.tsx
petark7 Jul 15, 2024
4ecbbcc
Merge remote-tracking branch 'origin/main' into #420-Update-staging
aleksandarmicev Jul 15, 2024
45bd18b
Merge pull request #424 from learnhubmk/#420-Update-staging
edichoska Jul 16, 2024
240e1a4
Implement delete functionality
petark7 Jul 16, 2024
571e788
Merge branch 'staging' into 366-fe-implement-delete-tag-functionality
petark7 Jul 17, 2024
1eb8cd1
replaced fetch with react query in Blogs, modified infinite scroll to…
DanielK-12 Jul 17, 2024
31a005b
changed fetch with react query in SubmitContactForm and ContactForm
DanielK-12 Jul 17, 2024
225c9f2
created add skill tag component
Jasminamih Jul 17, 2024
6c24723
created add skill tag component
Jasminamih Jul 17, 2024
79bda8e
fetched and displayed the data in the reusable table and fixed the so…
Mario-k4 Jul 18, 2024
6661112
Used better word naming.
Mario-k4 Jul 18, 2024
08d10c9
Initial version of blog posts fetching
petark7 Jul 19, 2024
2cc9e49
removed tags: { name: string }[]
Mario-k4 Jul 20, 2024
2a1db81
fixed eslint errors
Jasminamih Jul 20, 2024
77e9386
Transfer Tags components to components folder
petark7 Jul 21, 2024
861fcc3
Merge pull request #427 from learnhubmk/tags-transfer-components
edichoska Jul 21, 2024
840e229
Merge branch 'staging' into create-blogs-page-and-view
Mario-k4 Jul 21, 2024
4360886
removed comments
Mario-k4 Jul 21, 2024
14dc404
Merge branch 'staging' into create-blogs-page-and-view
Mario-k4 Jul 21, 2024
f32590e
Fixing buttons
MarijaTrajkoska Jul 21, 2024
2e37195
feat(auth): created 'authContext' for fetching, login and logging out…
stefanatanasovmk Jul 22, 2024
6ad1dc7
Merge branch '#382_Implement_authentication' of github.com:learnhubmk…
stefanatanasovmk Jul 22, 2024
fdb2ca0
used process.env,changed the error message and changed the any type
Mario-k4 Jul 22, 2024
4a38aea
style: hide 'register' and 'login' buttons in navigational bar on sma…
stefanatanasovmk Jul 22, 2024
53f65bb
made interfaces for type safety and impoved code readability
Mario-k4 Jul 23, 2024
863efcb
fix: removed unused components
stefanatanasovmk Jul 23, 2024
5e8dfe9
style: adjust indentation and formatting
stefanatanasovmk Jul 23, 2024
bd3f96b
fix: removed hardcoded url
stefanatanasovmk Jul 23, 2024
5cdba33
fix: removed unused login route
stefanatanasovmk Jul 23, 2024
1cec487
Merge pull request #422 from learnhubmk/create-blogs-page-and-view
edichoska Jul 23, 2024
fed4f09
feat(auth): added 'updateSession' middleware, 'getNewToken' server ac…
stefanatanasovmk Jul 28, 2024
39524ec
style: changed the 'type' of 'Sign up' and 'Register' buttons in the …
stefanatanasovmk Jul 28, 2024
0d9fc06
Add AxiosProvider
petark7 Jul 30, 2024
aee3e4d
GetUsers - use React Query
petark7 Jul 30, 2024
7b466d9
Translation + lift state to parent
petark7 Aug 3, 2024
2f9a5ac
Implement Add Tag functionality
petark7 Jul 15, 2024
89f7d4b
Implement Add Tag functionality
petark7 Aug 3, 2024
54fd679
Implement Add Tag functionality
petark7 Jul 15, 2024
7de8099
Implement delete functionality
petark7 Jul 16, 2024
c83b098
Implement delete functionality
petark7 Aug 3, 2024
1178528
Merge branch '366-fe-implement-delete-tag-functionality' of https://g…
petark7 Aug 3, 2024
e91ed9a
Remove unrelated functionality from branch
petark7 Aug 3, 2024
afa1ab4
Implement Add Tag functionality
petark7 Jul 15, 2024
720dd1a
Implement delete functionality
petark7 Jul 16, 2024
3e8ae58
Remove unrelated functionality from branch
petark7 Aug 3, 2024
369d821
Add temporary tag component
petark7 Aug 4, 2024
dd7af05
Merge branch '366-fe-implement-delete-tag-functionality' of https://g…
petark7 Aug 4, 2024
617e319
fix: adjusted eslint configuration to work better with typescript, in…
stefanatanasovmk Aug 4, 2024
a82c3ed
feat: added 'authorization' param in the useAuth hook which can be us…
stefanatanasovmk Aug 4, 2024
fd91a9b
Implement edit functionality
petark7 Aug 4, 2024
ffa1201
Fix conflicts with ReusableTable
petark7 Aug 4, 2024
da0b083
Update useMutation usage in addNewPost
petark7 Aug 5, 2024
d4fc0c4
Update components to use React Query implementation structure
petark7 Aug 5, 2024
5627b13
Merge remote-tracking branch 'origin/staging' into fetchToReactQuery-…
petark7 Aug 5, 2024
ee0324a
Merge pull request #425 from learnhubmk/366-fe-implement-delete-tag-f…
petark7 Aug 5, 2024
14895f0
Merge branch '359-fe-implement-add-tag-functionality' into feature/ta…
petark7 Aug 6, 2024
055f9a6
Merge edit functionality
petark7 Aug 6, 2024
097dc23
Implement search functionality
petark7 Aug 6, 2024
2202175
Implement debouncing
petark7 Aug 6, 2024
2208a70
Deleting buttons from navbar
MarijaTrajkoska Aug 6, 2024
1f3465c
Deleting sing in and sign out from navigation
MarijaTrajkoska Aug 7, 2024
02c961b
Fix lint problems
petark7 Aug 9, 2024
cb400c4
Remove React.FC
petark7 Aug 9, 2024
2ae1288
Fix issue with reusable table component row height
petark7 Aug 9, 2024
f4523fb
added reusable modal
Jasminamih Aug 11, 2024
a79368c
Merge remote-tracking branch 'origin/staging' into #386-Add-tags-comp…
Jasminamih Aug 11, 2024
3ad93c9
Merge branch 'staging' of github.com:learnhubmk/app into #382_Impleme…
stefanatanasovmk Aug 12, 2024
7f518db
Merge pull request #428 from learnhubmk/#382_Implement_authentication
edichoska Aug 12, 2024
652129c
Ignore whitespace in search results
petark7 Aug 13, 2024
6e62b84
Update login form
MarijaTrajkoska Aug 15, 2024
344e872
Merge pull request #433 from learnhubmk/tags-search
edichoska Aug 15, 2024
7085f8c
Merge branch 'staging' into fetchToReactQuery-petar
petark7 Aug 16, 2024
32062b5
Add axios
petark7 Aug 16, 2024
8c1cacd
Merge pull request #431 from learnhubmk/fetchToReactQuery-petar
edichoska Aug 17, 2024
d5b1ee1
Styling updates
petark7 Aug 17, 2024
dc2b7c9
Merge branch 'staging' into feature/tags-with-query
petark7 Aug 17, 2024
ed05325
Fetch tags with React Query
petark7 Aug 17, 2024
15844f9
dynamic blog route for view option
mitkapanarin Aug 18, 2024
97c7c34
Merge remote-tracking branch 'origin/staging' into #386-Add-tags-comp…
Jasminamih Aug 18, 2024
3d41554
installing dependencies
Jasminamih Aug 18, 2024
be82e17
fixing error
Jasminamih Aug 18, 2024
80b1c00
blog details data fetched
mitkapanarin Aug 18, 2024
e6ca303
updating dependencies to fix mismatch between package.json and packag…
edichoska Aug 18, 2024
ac40269
Merge pull request #426 from learnhubmk/#386-Add-tags-component
edichoska Aug 18, 2024
2a03c8e
Implement add tags functionality
petark7 Aug 18, 2024
a2a884d
Implement delete tags funcitonality
petark7 Aug 18, 2024
5738a86
Implement edit functionality + clarity changes
petark7 Aug 18, 2024
65abcd1
Fix typescript errors
petark7 Aug 18, 2024
a8183f3
Update useEditTag.ts
petark7 Aug 18, 2024
a482db6
Implement search functionality
petark7 Aug 18, 2024
16b544e
Update page.tsx
petark7 Aug 18, 2024
ccdf391
Login in content-panel
MarijaTrajkoska Aug 20, 2024
a451f06
Merge remote-tracking branch 'origin/staging' into #434_Update_login
MarijaTrajkoska Aug 20, 2024
ea443ea
Remove hardcoded token
petark7 Aug 21, 2024
5c84b14
Update axiosInstance.ts
petark7 Aug 21, 2024
4ca558b
Merge branch 'staging' into feature/tags-with-query
petark7 Aug 21, 2024
eeccc63
Merge branch 'feature/tags-with-query' of https://github.com/learnhub…
petark7 Aug 21, 2024
8036c34
Implement refetching on CRUD operations
petark7 Aug 21, 2024
43f1257
blog details data fetched
mitkapanarin Aug 23, 2024
7b2f320
TiptapEditor added
mitkapanarin Aug 24, 2024
6420e62
changes
mitkapanarin Aug 25, 2024
120b428
changes
mitkapanarin Aug 25, 2024
ae9ce81
reusable blog card added
mitkapanarin Aug 25, 2024
b1f0ac1
single state object created
mitkapanarin Aug 26, 2024
33f4547
code block added
mitkapanarin Aug 26, 2024
dfbc947
removed slug and added content description
mitkapanarin Aug 27, 2024
68372c6
updated inputs style
mitkapanarin Aug 28, 2024
a995afc
try&catch block added for handeling errors
mitkapanarin Aug 28, 2024
3006f4d
inputs valitation
mitkapanarin Aug 28, 2024
e752f18
unnecessary logs removed
mitkapanarin Aug 28, 2024
0849b96
Update BlogDetailsPage with edit and delete buttons; integrate BlogEd…
mitkapanarin Aug 29, 2024
e7c27c2
View Blog List button added
mitkapanarin Aug 29, 2024
cfc739f
unnececarry code removed
mitkapanarin Aug 30, 2024
c408ed6
unnececarry code removed
mitkapanarin Sep 5, 2024
322d7d6
created new data-fetching file
mitkapanarin Sep 5, 2024
a49c010
updated login form and auth context
Jasminamih Sep 7, 2024
bd3acdd
Added row click navigation to individual blog page
mitkapanarin Sep 7, 2024
4f7c966
return to blog list button added
mitkapanarin Sep 8, 2024
630eaf7
return to blog list button added
mitkapanarin Sep 8, 2024
3425fc0
created an interface for the BlogDetailsData
mitkapanarin Sep 8, 2024
023ca84
type added
mitkapanarin Sep 8, 2024
7c24960
.
mitkapanarin Sep 8, 2024
c7f6f07
nested buttons removed
mitkapanarin Sep 8, 2024
bf3b3b1
nested buttons removed
mitkapanarin Sep 8, 2024
b6cfc0b
Make onClick a required prop and update related handlers
mitkapanarin Sep 8, 2024
e7eac6e
pass handleView as prop to ReusableTable
mitkapanarin Sep 9, 2024
8344980
Merge branch 'staging' into 383-fe-view-individual-blog-posts
mitkapanarin Sep 10, 2024
c2da941
edit and view updated
mitkapanarin Sep 10, 2024
dd74be9
.
mitkapanarin Sep 10, 2024
37d0bce
Merge pull request #438 from learnhubmk/383-fe-view-individual-blog-p…
edichoska Sep 11, 2024
0006321
Fix edit and cancel button toggle in blog details card
mitkapanarin Sep 11, 2024
e9b197d
image validation added
mitkapanarin Sep 12, 2024
83288bb
added gitleaks into husky precommit hook, implemented configuration f…
edichoska Sep 15, 2024
d7cefbe
Merge pull request #441 from learnhubmk/implement-git-leaks-pre-commi…
edichoska Sep 15, 2024
33ddc86
required inputs added
mitkapanarin Sep 16, 2024
3d404bf
update BlogDetailsPage and BlogDetailsCard
mitkapanarin Sep 16, 2024
3acee12
Added hardcoded author dropdown to BlogDetailsCard
mitkapanarin Sep 18, 2024
2078125
Dropzone Integration
mitkapanarin Sep 18, 2024
c3fc621
Dropzone Integration
mitkapanarin Sep 18, 2024
043f581
Dropzone Integration
mitkapanarin Sep 19, 2024
a272847
Dropzone Integration
mitkapanarin Sep 19, 2024
5154693
Removed author dropdown,added hardcoded author value with TODO for fu…
mitkapanarin Sep 24, 2024
333da28
Added DropZone component
mitkapanarin Sep 24, 2024
d427d40
Refactor author inputs to a single field
mitkapanarin Sep 24, 2024
8cde2cd
used camelCase for naming the properties inside the interface
mitkapanarin Sep 24, 2024
d4ca8eb
CancelModal added
mitkapanarin Sep 24, 2024
ceb75d3
TipTapEditor updated
mitkapanarin Sep 25, 2024
c5b5d53
TipTapEditor updated
mitkapanarin Sep 25, 2024
7b8c622
code updated
mitkapanarin Sep 25, 2024
6060e96
code updated
mitkapanarin Sep 26, 2024
d5894b2
code updated
mitkapanarin Sep 26, 2024
4fdf3c0
refactored block details card component
mitkapanarin Sep 27, 2024
eaa43e1
redux added
mitkapanarin Sep 27, 2024
cc6c79c
changed content manager
Jasminamih Sep 27, 2024
e4be6aa
code updated
mitkapanarin Sep 27, 2024
7ddca35
cancel modal updated on cancel btn
mitkapanarin Sep 27, 2024
4b7b218
EditorContext added
mitkapanarin Sep 27, 2024
3e1ed8c
Image upload optional
mitkapanarin Sep 27, 2024
3dc1e80
.
mitkapanarin Sep 27, 2024
93e391b
Merge pull request #440 from learnhubmk/384-feedit-individual-blog-post
edichoska Sep 27, 2024
6264ebf
ReusableForm refactored
mitkapanarin Sep 30, 2024
87307f7
signup work in progress
mitkapanarin Sep 30, 2024
67b4d2a
Refactor: Extract form logic, improve reusability
mitkapanarin Oct 1, 2024
50c07bf
login updated
mitkapanarin Oct 12, 2024
8133d6f
.
mitkapanarin Oct 12, 2024
5ed6310
.
mitkapanarin Oct 12, 2024
cfe2904
.
mitkapanarin Oct 12, 2024
ed321e9
updated code
mitkapanarin Oct 13, 2024
31529d7
updated code
mitkapanarin Oct 13, 2024
5db475f
updated code
mitkapanarin Oct 13, 2024
e3ce1b0
Added type button and updated dashboard page component to Dashboard
AnetaDimoska Nov 1, 2024
f099358
Implemented NextAuth authentication on content-panel/login page with …
AnetaDimoska Nov 10, 2024
31b1981
Update page.tsx
petark7 Nov 11, 2024
b2a7695
Simplify error handling
petark7 Nov 11, 2024
dcc638e
Fix type errors
petark7 Nov 11, 2024
b35d394
Update queryKeys to use defined constants
petark7 Nov 11, 2024
327e31f
Update ReusableTable and TableRowComponents to solve conflicts
petark7 Nov 11, 2024
c75f947
Merge branch 'staging' into feature/tags-with-query
petark7 Nov 11, 2024
6ee47dc
Update eslint-config-next version to newest + modify gitleaks configu…
petark7 Nov 12, 2024
dacfa08
Rename /api to /apis
petark7 Nov 12, 2024
66bfced
Merge pull request #439 from learnhubmk/feature/tags-with-query
edichoska Nov 12, 2024
2ff0a67
Initial form with validation
petark7 Nov 12, 2024
c51ac42
Initial implementation of BlogTags
petark7 Nov 13, 2024
2e9c195
Fix styling
petark7 Nov 13, 2024
4182a94
Improve UI
petark7 Nov 13, 2024
a5f66a9
Reworked LoginForm component to accept props; Updated files as per PR…
AnetaDimoska Nov 13, 2024
dc79c47
Removed commented code from authContext file
AnetaDimoska Nov 13, 2024
c168683
CSS improvements
petark7 Nov 14, 2024
6b85bc3
Clean up parent component, improve component names
petark7 Nov 14, 2024
5bb7169
Implement styling, add TipTap editor
petark7 Nov 14, 2024
f867fac
Fully implement blog post feature, including validation and styling
petark7 Nov 14, 2024
2cf5639
Refactor code
petark7 Nov 15, 2024
931f75c
Translate placeholder text
petark7 Nov 15, 2024
cb7bfc9
Improve validation in TagInput component
petark7 Nov 15, 2024
c153898
Added 'remember' key in the payload that is sent to backend whenever …
AnetaDimoska Nov 15, 2024
2124286
Updated import location of Role type in session.ts file
AnetaDimoska Nov 15, 2024
87cfc90
Updated import location of Role type in getAuthUrl.ts file
AnetaDimoska Nov 15, 2024
f5265c7
Merge branch 'staging' into Implement_login_auth
AnetaDimoska Nov 15, 2024
231ca68
Update types
petark7 Nov 18, 2024
eabe1af
Initial pagination implementation
petark7 Nov 18, 2024
ad81959
Add styling in pagination buttons + fix types in getTags
petark7 Nov 18, 2024
fb82a20
Remove unnecessary comments
petark7 Nov 18, 2024
c442d26
Do filtering logic in query + fix toast error bug
petark7 Nov 19, 2024
4e74699
Adjusted tsconfig.json to map @/* to the root directory
AnetaDimoska Nov 19, 2024
a2458e4
Merge branch 'Implement_login_auth' of https://github.com/learnhubmk/…
AnetaDimoska Nov 19, 2024
dfad2f8
Merge pull request #451 from learnhubmk/page-based-pagination
edichoska Nov 21, 2024
606959e
Fixed merge conflicts
AnetaDimoska Nov 21, 2024
4e675ed
Add PR template (#452)
Tikkurilla Nov 21, 2024
2859644
Fixing imports due to merge conflicts
AnetaDimoska Nov 24, 2024
22f2127
fix: :bug: Handled error in sihnup page
AnetaDimoska Nov 24, 2024
f6d5fac
Merge remote-tracking branch 'origin/staging' into Implement_login_auth
AnetaDimoska Nov 24, 2024
a78dd7f
Merge pull request #449 from learnhubmk/Implement_login_auth
edichoska Nov 28, 2024
6cb1bad
Merge pull request #450 from learnhubmk/blogs-create-article
edichoska Dec 1, 2024
6668f7c
Convert tag type from number to string
petark7 Dec 1, 2024
0a77596
Merge pull request #459 from learnhubmk/fix-tags-types
edichoska Dec 1, 2024
b091ad0
Improve <ResuableTable/> UI
petark7 Dec 2, 2024
8596b0d
UI improvements
petark7 Dec 2, 2024
97172a9
Translate fields, add link to create post button
petark7 Dec 2, 2024
b836508
feat: :lipstick: Implement loading skeleton, fix "no data" message bu…
petark7 Dec 2, 2024
5a710bd
Delete helpers.tsx
petark7 Dec 2, 2024
6d7a3a5
refactor: :art: Refactor Search component for reusability
petark7 Dec 3, 2024
a671564
Merge pull request #460 from learnhubmk/content-panel-improvements
edichoska Dec 3, 2024
dc7aa8f
fix auth logic:
petark7 Dec 8, 2024
836124b
refactor: Migrate to NextAuth and clean up authentication implementation
petark7 Dec 9, 2024
7e22206
refactor: Remove redirect from useLogin mutation
petark7 Dec 10, 2024
36fee5f
Merge pull request #466 from learnhubmk/fixAuth-petar
edichoska Dec 11, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.examples
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@ NEXT_PUBLIC_API_BASE_URL=
API_KEY=
NEXT_PUBLIC_TURNSTILE=0x4AAAAAAAWq36_j09RgOKQR


# Test variables
BASE_URL = "http://localhost:3000"
DEBUG_LEVEL = "info" # info or debug
7 changes: 5 additions & 2 deletions .gitleaks.toml
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
title = "Custom Gitleaks Config"

[allowlist]
files = ["package-lock.json"]
files = [
"package-lock.json",
"node_modules/"
]
regexes = ["https://registry\\.npmjs\\.org"]
paths = ['''package-lock\.json''']
paths=["package-lock.json"]

# Rule to detect API keys
[[rules]]
105 changes: 105 additions & 0 deletions Types/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
/* eslint-disable no-unused-vars */

import { MutationStatus, QueryStatus } from '@tanstack/react-query';
import { HTMLProps } from 'react';

export enum Role {
admin = 'admin',
content_manager = 'content_manager',
content = 'content',
member = 'member',
}

export type UserType = {
id: number | string;
is_verified: boolean;
email: string;
role: Role;
};

export interface LoginParams {
email: string;
password: string;
cfTurnstileResponse: string;
role?: string;
remember: boolean;
}

export interface AuthContextType {
user: UserType | null;
login: (params: LoginParams & { userType: string; redirectUrl: string }) => void;
logout: () => void;
userQuery: {
status: QueryStatus;
error: Error | null;
isLoading: boolean;
};
loginMutation: {
isLoading: boolean;
status: MutationStatus;
error: Error | null;
};
logoutMutation: {
isLoading: boolean;
status: MutationStatus;
error: Error | null;
};
loginStatus: MutationStatus;
}

export interface LoginResponse {
data: {
user: UserType;
access_token: string;
};
}

export interface Session {
token: string;
}

export interface LoginFormProps {
onSubmit: (values: LoginParams) => Promise<void>;
isLoading?: boolean;
turnstileToken?: string | null;
setTurnstileToken?: (token: string) => void;
}

export interface FormField {
name: string;
type: string;
label: string;
placeholder: string;
}

export interface SocialLink {
id: string;
icon: string;
url: string;
alt: string;
}

export interface ReusableFormProps {
title: string;
fields: FormField[];
initialValues: any;
validationSchema: any;
onSubmit: (values: any) => Promise<void>;
submitButtonText: string;
socialLinks?: SocialLink[];
alternativeActionText?: string;
alternativeActionLink?: string;
alternativeActionLinkText?: string;
}

export interface InputProps extends HTMLProps<HTMLInputElement> {
placeholder: string;
label: string;
name: string;
type: string;
field: string;
formik: any;
isRequired?: boolean;
isFooter?: boolean;
inputClass?: string[];
}
40 changes: 40 additions & 0 deletions Types/next-auth.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/* eslint-disable */
/* tslint:disable */
/* eslint-disable @typescript-eslint/no-unused-vars */

// eslint-disable-next-line @typescript-eslint/no-unused-vars
import NextAuth from 'next-auth';
import { JWT } from 'next-auth/jwt';

declare module 'next-auth' {
interface Session {
accessToken: string | unknown;
expires: string;
user: {
id: string | unknown;
name?: string | unknown;
email?: string | unknown;
image?: string | unknown;
};
}
}

declare module 'next-auth' {
interface JWT {
accessToken?: string;
id: string;
name?: string;
email?: string;
exp?: number;
}
}
declare module 'next-auth' {
interface User {
id: string;
name?: string;
email?: string;
image?: string;
accessToken?: string;
remember?: boolean;
}
}
123 changes: 123 additions & 0 deletions api/authApi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import { LoginParams, LoginResponse, Role, UserType } from '../Types';
import {
getFromLocalStorage,
removeFromLocalStorage,
saveToLocalStorage,
} from './utils/localStorageUtils';

const baseUrl = process.env.NEXT_PUBLIC_API_BASE_URL || '';

export const getUser = async (): Promise<UserType | null> => {
const session = getFromLocalStorage('session');
if (!session?.token) {
console.log('No session token found, user is not authenticated');
return null;
}

try {
const response = await fetch(`${baseUrl}/content/user`, {
headers: {
Accept: 'application/json',
Authorization: `Bearer ${session.token}`,
},
});

if (!response.ok) {
if (response.status === 401) {
console.log('Unauthorized access, clearing session');
removeFromLocalStorage('session');
removeFromLocalStorage('user');
}
throw new Error(response.statusText || 'An error occurred while fetching the user');
}

const data = await response.json();
console.log('User data fetched successfully:', data.data);
return data.data;
} catch (error) {
console.error('Error fetching user:', error);
return null;
}
};

export const login = async ({
email,
password,
cfTurnstileResponse,
}: LoginParams): Promise<LoginResponse> => {
console.log('Login attempt for email:', email);

try {
const response = await fetch(`${baseUrl}/content/login`, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({ email, password, cfTurnstileResponse }),
});

const data = await response.json();

if (!response.ok) {
console.error('Login error:', data);
if (response.status === 422) {
const errorMessage = data.message || 'Validation failed';
const errors = data.errors || {};
throw new Error(JSON.stringify({ message: errorMessage, errors }));
}
throw new Error(data.message || 'An error occurred while logging in');
}

console.log('Login successful');

if (data.data && data.data.access_token && data.data.user) {
console.log('Setting session and user data');
saveToLocalStorage('session', {
token: data.data.access_token,
role: Role.content,
});
saveToLocalStorage('user', data.data.user);
} else {
console.error('Login response is missing expected data');
throw new Error('Invalid login response data');
}

return data;
} catch (error) {
console.error('Login process failed:', error);
throw error;
}
};

export const logout = async (): Promise<void> => {
const session = getFromLocalStorage('session');
if (!session?.token) {
console.log('No session found, user is already logged out');
return;
}

try {
const response = await fetch(`${baseUrl}/content/logout`, {
method: 'POST',
headers: {
Accept: 'application/json',
Authorization: `Bearer ${session.token}`,
},
});

if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.message || 'An error occurred while logging out');
}

console.log('Logout successful');
} catch (error) {
console.error('Logout process failed:', error);
throw error;
} finally {
console.log('Clearing session');
removeFromLocalStorage('session');
removeFromLocalStorage('user');
}
};
38 changes: 38 additions & 0 deletions api/utils/actions/session.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { Session, UserType } from '../../../Types';

export const setSession = async (sessionData: Session | null): Promise<void> => {
console.log('setSession called with:', sessionData);
if (sessionData === null) {
localStorage.removeItem('session');
console.log('Session removed from localStorage');
} else {
localStorage.setItem('session', JSON.stringify(sessionData));
console.log('Session saved to localStorage', localStorage.getItem('session'));
}
};

export const getSession = async (): Promise<Session | null> => {
const sessionData = localStorage.getItem('session');
return sessionData ? JSON.parse(sessionData) : null;
};

export const clearSession = async (): Promise<void> => {
localStorage.removeItem('session');
localStorage.removeItem('user');
};

export const setUser = async (user: UserType | null): Promise<void> => {
console.log('setUser called with:', user);
if (user === null) {
localStorage.removeItem('user');
console.log('User removed from localStorage');
} else {
localStorage.setItem('user', JSON.stringify(user));
console.log('User saved to localStorage');
}
};

export const getUserFromStorage = async (): Promise<UserType | null> => {
const userData = localStorage.getItem('user');
return userData ? JSON.parse(userData) : null;
};
31 changes: 31 additions & 0 deletions api/utils/localStorageUtils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
export const saveToLocalStorage = (key: string, value: any): void => {
try {
const serializedValue = JSON.stringify(value);
localStorage.setItem(key, serializedValue);
console.log(`Saved to localStorage: ${key}`, value);
} catch (error) {
console.error(`Error saving to localStorage: ${key}`, error);
}
};

export const getFromLocalStorage = (key: string): any => {
try {
const serializedValue = localStorage.getItem(key);
if (serializedValue === null) {
return null;
}
return JSON.parse(serializedValue);
} catch (error) {
console.error(`Error getting from localStorage: ${key}`, error);
return null;
}
};

export const removeFromLocalStorage = (key: string): void => {
try {
localStorage.removeItem(key);
console.log(`Removed from localStorage: ${key}`);
} catch (error) {
console.error(`Error removing from localStorage: ${key}`, error);
}
};
17 changes: 17 additions & 0 deletions app/admin-dashboard/login/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import React from 'react';

import SignupAndLoginLayout from '../../../components/reusable-components/signup-and-login-layout/SignupAndLoginLayout';
import AdminPanelLoginContainer from '../../../components/reusable-components/login-form/AdminPanelLoginContainer';

const AdminLogin = () => {
return (
<SignupAndLoginLayout
welcomeTitle="Admin Login Panel (draft content)!"
welcomeSubtitle="Ве молиме пополнете ги податоците подолу за да се најавите."
>
<AdminPanelLoginContainer />
</SignupAndLoginLayout>
);
};

export default AdminLogin;
8 changes: 7 additions & 1 deletion app/admin-dashboard/page.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import LogoutButton from '../../components/reusable-components/button/LogoutButton';

const AdminDashboardPage = () => {
return <div>AdminDashboardPage</div>;
return (
<div>
AdminDashboardPage <LogoutButton redirectUrl="/admin-dashboard/login" />
</div>
);
};

export default AdminDashboardPage;
Loading