diff --git a/angular.json b/angular.json index 09c758c..d57ab7e 100755 --- a/angular.json +++ b/angular.json @@ -22,7 +22,6 @@ "browser": "src/main.ts", "allowedCommonJsDependencies": [ "highlight.js", - "quill-delta", "whatwg-url", "@supabase/node-fetch" ], diff --git a/reset-password.ts b/reset-password.ts index 9e5b497..e2860c6 100644 --- a/reset-password.ts +++ b/reset-password.ts @@ -6,8 +6,7 @@ * USAGE (bash): * export SUPABASE_URL="https://aqdbdmepncxxuanlymwr.supabase.co" * export SERVICE_ROLE_KEY="YOUR_SERVICE_ROLE_KEY_HERE" - * npx ts-node reset-password.ts \ - * a3b3cf93-6956-41c7-bec0-1qwqwd42f26 'N3w-Pa$$w0rd!' + * npx tsx reset-password.ts ID 'lSupa' *********************************************************************/ import { createClient } from '@supabase/supabase-js'; diff --git a/src/app/admin/_components/add-post/add-post.component.html b/src/app/admin/_components/add-post/add-post.component.html index d624356..36a5138 100755 --- a/src/app/admin/_components/add-post/add-post.component.html +++ b/src/app/admin/_components/add-post/add-post.component.html @@ -1,24 +1,19 @@ @defer { -
-
- -
- @if (blogForm.controls.title.invalid && (blogForm.controls.title.dirty || blogForm.controls.title.touched)) { - @if (blogForm.controls.title.errors?.['required']) { -
Title is required.
- } - } -<<<<<<< HEAD - - -
- - -
-======= - - - ->>>>>>> ab739b9 (nothing special) -
+
+
+ +
+ @if (blogForm.controls.title.invalid && (blogForm.controls.title.dirty || blogForm.controls.title.touched)) { + @if (blogForm.controls.title.errors?.['required']) { +
Title is required.
+ } + } + + +
+ + +
+ +
} diff --git a/src/app/admin/_components/add-post/add-post.component.ts b/src/app/admin/_components/add-post/add-post.component.ts index 0e18215..8e16517 100755 --- a/src/app/admin/_components/add-post/add-post.component.ts +++ b/src/app/admin/_components/add-post/add-post.component.ts @@ -62,9 +62,9 @@ export class AddPostComponent implements OnInit { validators: [Validators.required], nonNullable: true, }), - date: new FormControl(null), + created_at: new FormControl(null), description: new FormControl(null), - isDraft: new FormControl(false, { nonNullable: true }), + is_draft: new FormControl(false, { nonNullable: true }), }); range: Range | null = null; @@ -80,6 +80,7 @@ export class AddPostComponent implements OnInit { this.apiService.getPostById(this.postId).subscribe((post) => { if (post) { this.blogForm.patchValue(post); + console.log(this.blogForm.value); } }); } @@ -95,9 +96,9 @@ export class AddPostComponent implements OnInit { const rawContent = this.blogForm.controls.content.value as string; const cleanedContent = rawContent.replace(/( |\u00A0)/g, ' '); this.blogForm.controls.content.setValue(cleanedContent); - this.blogForm.controls.isDraft.setValue(isDraft); - if (!this.blogForm.controls.date.value) { - this.blogForm.controls.date.setValue(null); + this.blogForm.controls.is_draft.setValue(isDraft); + if (!this.blogForm.controls.created_at.value) { + this.blogForm.controls.created_at.setValue(null); } if (this.postId) { this.apiService.updatePost(this.postId, this.blogForm.value as Post); diff --git a/src/app/admin/_models/post-from.inteface.ts b/src/app/admin/_models/post-from.inteface.ts index d0ac88f..518f012 100644 --- a/src/app/admin/_models/post-from.inteface.ts +++ b/src/app/admin/_models/post-from.inteface.ts @@ -4,7 +4,7 @@ import { SafeHtml } from '@angular/platform-browser'; export interface PostForm { title: FormControl; content: FormControl; - isDraft: FormControl; - date: FormControl; + is_draft: FormControl; + created_at: FormControl; description?: FormControl; } diff --git a/src/app/admin/_services/admin-api.service.ts b/src/app/admin/_services/admin-api.service.ts index 28dc040..3a3c5af 100755 --- a/src/app/admin/_services/admin-api.service.ts +++ b/src/app/admin/_services/admin-api.service.ts @@ -3,16 +3,22 @@ import { inject, Injectable } from '@angular/core'; import { map, Observable } from 'rxjs'; import { Post } from '../../supabase-types'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; +import { SupabaseService } from '../../services/supabase.service'; @Injectable() export class AdminApiService { http = inject(HttpClient); + supabaseService = inject(SupabaseService); private readonly baseUrl = 'https://aqdbdmepncxxuanlymwr.supabase.co/rest/v1/'; private readonly apiKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImFxZGJkbWVwbmN4eHVhbmx5bXdyIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDUwNTA0MjYsImV4cCI6MjA2MDYyNjQyNn0.RNtZZ4Of4LIP3XuS9lumHYdjRLVUGXARtAxaTJmF7lc'; - addPost(post: Post): void {} + async addPost(post: Post): Promise { + const { error } = await this.supabaseService.getClient + .from('posts') + .insert({ ...post }); + } getPostById(id: string): Observable { const selectQuery = ` @@ -39,7 +45,13 @@ export class AdminApiService { .pipe(map((results) => results[0] ?? null)); } - updatePost(id: string, post: Post): Promise { - return Promise.resolve(); + async updatePost(id: string, post: Post): Promise { + await this.supabaseService.getClient + .from('posts') + .update({ ...post }) + .eq('id', id) + .then((x) => { + console.log(x); + }); } } diff --git a/src/app/reader/_components/main-page/post/post.component.html b/src/app/reader/_components/main-page/post/post.component.html index c644423..bca446c 100755 --- a/src/app/reader/_components/main-page/post/post.component.html +++ b/src/app/reader/_components/main-page/post/post.component.html @@ -3,7 +3,7 @@
{{ post()?.title }}
diff --git a/src/app/reader/_components/main-page/post/post.component.ts b/src/app/reader/_components/main-page/post/post.component.ts index 5155254..cfbd241 100755 --- a/src/app/reader/_components/main-page/post/post.component.ts +++ b/src/app/reader/_components/main-page/post/post.component.ts @@ -35,7 +35,7 @@ export class PostComponent implements OnInit { postStore = inject(PostStore); post: Signal = this.postStore.post; - date: string = ''; + date: Signal = this.postStore.date; private dialogService = inject(DynamicDialogService); private viewContainerRef = inject(ViewContainerRef); diff --git a/src/app/reader/_components/main-page/post/post.store.ts b/src/app/reader/_components/main-page/post/post.store.ts index 0228be2..e1c9a3c 100644 --- a/src/app/reader/_components/main-page/post/post.store.ts +++ b/src/app/reader/_components/main-page/post/post.store.ts @@ -1,14 +1,23 @@ import { inject } from '@angular/core'; -import { patchState, signalStore, withMethods, withState } from '@ngrx/signals'; +import { computed } from '@angular/core'; +import { + patchState, + signalStore, + withMethods, + withState, + withComputed, +} from '@ngrx/signals'; import { rxMethod } from '@ngrx/signals/rxjs-interop'; import { pipe, switchMap, tap } from 'rxjs'; import { tapResponse } from '@ngrx/operators'; import { Post } from '../../../../types/supabase'; import { ReaderApiService } from '../../../_services/reader-api.service'; +import { formatDateToDDMMYYYY } from '../../../../utlis/date-utils'; type PostState = { post: Post | null; + date: string | null; loading: boolean; error: string | null; }; @@ -17,12 +26,15 @@ const initialState: PostState = { post: null, loading: false, error: null, + date: null, }; export const PostStore = signalStore( { providedIn: 'root' }, withState(initialState), - + withComputed((store) => ({ + date: computed(() => formatDateToDDMMYYYY(store.post()?.created_at)), + })), withMethods((store, postService = inject(ReaderApiService)) => ({ getPost: rxMethod( pipe( diff --git a/src/app/shared/about-me/about-me.component.html b/src/app/shared/about-me/about-me.component.html index 753415e..3d67d6b 100644 --- a/src/app/shared/about-me/about-me.component.html +++ b/src/app/shared/about-me/about-me.component.html @@ -13,5 +13,5 @@

new challenges.

- + diff --git a/src/app/shared/navbar/navbar.component.ts b/src/app/shared/navbar/navbar.component.ts index 0d27774..38d3807 100644 --- a/src/app/shared/navbar/navbar.component.ts +++ b/src/app/shared/navbar/navbar.component.ts @@ -14,7 +14,6 @@ import { import { DynamicDialogService } from '../dynamic-dialog/dynamic-dialog.service'; import { LoginCompontent } from '../../auth/login/login.component'; import { RouterLink } from '@angular/router'; -import { SupabaseService } from '../../services/supabase.service'; @Component({ selector: 'blog-navbar', diff --git a/src/app/types/supabase/posts.ts b/src/app/types/supabase/posts.ts index 079ae2a..b4e75df 100644 --- a/src/app/types/supabase/posts.ts +++ b/src/app/types/supabase/posts.ts @@ -4,7 +4,7 @@ import { Comment } from './comments'; export type Post = { content: string; - created_at: string | null; + created_at: Date | null; description: string; id: string; is_draft: boolean; diff --git a/src/app/utlis/date-utils.ts b/src/app/utlis/date-utils.ts new file mode 100644 index 0000000..6358dd9 --- /dev/null +++ b/src/app/utlis/date-utils.ts @@ -0,0 +1,12 @@ +/** + * Formats a date into a DD-MM-YYYY string format + * @param dateInput - Date object or string that can be parsed into a Date + * @returns Formatted date string in DD-MM-YYYY format + */ +export function formatDateToDDMMYYYY(dateInput: Date | string | undefined | null): string { + const date = dateInput ? new Date(dateInput) : new Date(); + const day = `${date.getDate()}`.padStart(2, '0'); + const month = `${date.getMonth() + 1}`.padStart(2, '0'); + const year = date.getFullYear(); + return `${day}-${month}-${year}`; +}