مضى على الشبكة و يوم من العطاء.

Notion_api_first_part

ibadaibada is verified member.

./عضو جديد
>:: v1p ::<

السمعة:

السلام عليكم و رحمة الله و بركاته

اليوم سنجرب صنع واجهة برمجة التطبيقات (API) لموقع NOTION

ماهو واجهة برجمة التطبيقات أو API :


إن API ببساطة هو مجموعة من البرمجيات التى تسمج لتطبيقين مختلفين التواصل والتفاعل مع بعضهم البعض. عند استخدام API، يمكن للمطورين استخدام وظائف محددة أو الحصول على بيانات محددة من تطبيق آخر أو خدمة ويب دون الحاجة إلى معرفة كامل التفاصيل عن كيفية عمل هذا التطبيق أو الخدمة. وبالتالي، يمكن للمطورين بناء تطبيقات جديدة تعتمد على البيانات أو الخدمات التي توفرها API بدلاً من إعادة بناء كل هذه الوظائف من الصفر (التعريف من موقع </مطور>)


فالـ api بكل بساطة هو مكان أرسل فيه طلب لبيانات فيرسلها لي إذا كان موجودة قد تكون ببصيغة json (أكثر شهرة) أو xml أو yaml (أقل شهرة)


1724187180059.webp

لماذا أريد صنع ِAPI لهذا الموقع ؟

- أكتب ملاحظات شخصية يومية

- أشفر الملاحظات الشخصية قبل ما أحطها بالموقع

المشروع سيكون بلغة typescript مع Next framework


لذلك ستحتاج إلى:

1. node package manager

2. Operating systems: macOS, Windows (including WSL), or Linux

3. text editor like vsc

fa.webp

بسم الله نبدأ...

أول شيء سنحتاجه إنشاء مشروع next-js وده راح يكون باستخدام الأمر التالي :
كود:
npx create-next-app@latest

ثم سيسألنا أسئلة غريبة كالتالي:

كود:
What is your project named? notion-api

Would you like to use TypeScript? No / Yes

Would you like to use ESLint? No / Yes

Would you like to use Tailwind CSS? No / Yes

Would you like your code inside a `src/` directory? No / Yes

Would you like to use App Router? (recommended) No / Yes

Would you like to use Turbopack for `next dev`?  No / Yes

Would you like to customize the import alias (`@/*` by default)? No / Yes


🔹السؤال الأول: عن ماذا ستسمي مشروعك.

🔹السؤال الثاني: هل ستسخدم typescript و نعم سنستخدمه وسنشرح فرق بينه و بين javascript

🔹السؤال الثالث: هل ستسخدم eslint و هي اضافة بتحدد أخطاء و التحذيرات في مشروعك و سنتكلم عليها بإذن الله

🔹السؤال الرابع: هل ستسخدم tailwind و هو framework csss و نعم سنستخدمه في هذا المشروع و سنشرح بعض تفاصيله

🔹 السؤال الخامس: هل تريد أن يكون المشروع أو أكواد المشروع داخل ملف src لا و ماعندي سبب

🔹السؤال السادس: هل ستسخدم إضافة App Router نعم وسنشرح بعض تفاصيلها إن شاء الله

🔹السؤال السابع: هل ستسخدم إضافة turbopack هذه إضافة هي bundler جديد صمم ليكون بديلًا عن webpack في هذا المشروع بنستخدم webpack

لذلك
سأجيب بـ لا

ال bundler هو أداة التي تترجم ملفات المشروع و أكواد ال css ,js الخ إلى موقع أو تطبيق , و أشهرهم كما قلنا هو ال webpack

1724278812162.webp



الثامن سيكون غريبًا لو ترجمته لذلك سنتطرق إليه في وسط الشرح بإذن الله

في الأخير سيكون لدينا ملف اسمه notion-api و ستكون داخله ملفات المشروع.


1724279083586.webp





ثاني شيء سيكون رحلة البحث عن notion api سيكون لموقع notion api's و نحن سننستخدمهم

هذا هو الموقع: devs.notion


1724279380089.webp


هذا سيكون صديقنا طوال المشروع
أول شيء يطلب منا هو internal integration

internal integration هو الذي سيتيح لنا التواصل مع صفاحتنا بالموقع فلإتمام هذه العملية سنطلب توكن من الموقع و سيتيح لنا من خلاله التواصل مع الموقع.

سندخل لهذه الصفحة: notion.integration

تم سنضغط new intgration


1724280083460.webp



1724280374603.webp


📍internal integration : مصممة لأشخاص المسؤول هو الذي يحددهم أي أنها مثالية عندما تكون مع فريق أو وحدك
📍external integration :مصممة لجمهور أوسع و أي شخص لديه حساب في notion يستطيع الإنضمام

ندخل لـ manage settings

1724280533759.webp



نقوم بالرجوع للمشروع ننشئ ملف نسميه .env, ونكتب فيه اسم env var و نقوم بلصق توكن ال intgration


1724280724213.webp


ندخل على موقع notion تم على صفحة التي نريد صنع الواجهة لها تم كما هو موضح في الصورة:


1724415878225.webp


هذا سيتيح لأي شخص لديه التوكن حق integration أن يعدل على الصفحة

سندخل على وثائق الموقع بذات في retrieve a database:
retrieve.database.notion


1724702898249.webp


نقوم بالرجوع على مشروعنا ونكتب الأمر التالي:
كود:
npm run dev


1724336772961.webp



بيظهر لنا أن المشروع بدأ في الينك الآتي على المنفذ 3000 نقوم بدخول إليه:


1724336849589.webp


تظهر لنا هذه الواجهة يمكنك إلقاء النظرة عليها لأنها تحتوي على روابط قد تكون مفيدة لمن يريد تعلم هذا الإطار

نرجع لمحرر الأكواد ونقوم بالدخول على مجلد app تم ملف page.tsx و نقوم بمسح كل شيء:


أول شيء نكتبه:


1724338303070.webp



نعيد فتح المتصفح على المنفذ 3000 فسنرى أن:


1724338366592.webp


داخل مجلد app نفتح مجلد نسميه lib ننشئ ملف نسميه action.ts, و نقوم بلصق الكود الذي أخدنه من وثائق موقع notion

1724338525754.webp


نرجع لملف .env, ننشئ env var نسميه databaseID و نعطيه قيمة معرف الصفحة التي نسخها من رابط الموقع.



1724338753248.webp



تم بنجاح...


1724338897634.webp


نرجع لملف app/lib/actions.ts, نقوم بتغيرات بسيطة كما هي موضحة بالصور:



1724339169700.webp


1724703676219.webp


نشرح المصطلحات التي تم تستطيرها بالأصفر:
[COLOR=rgb(247, 218, 100)]require('@notionhq/client');[/COLOR]

هذا يعني أنه سنحتاج إلى مكتبة اسمها @notionhq/client لذلك سنقوم بتنزيلها باستعمال الأمر التالي:
كود:
npm install @notionhq/client

📍function async :هي دوال التي تقدم نتائجها بشكل غير متزامن أي أنها لا تعتمد على دالة أخرى فيمكن للبرنامج تشغيلها و تشغيل أي شي آخر بنفس الوقت

📍await keyword :يجعل الدالة تتوقف حتى تأخد نتيجة تم تستمر

📍console.log: هي الدالة التي تقوم بطباعة الأشياء مثل Print في python أو printf في c أو C++ أو ECHO في php ومررنا لها الثابث response الذي سرطرنا تحته بالأزرق

و الآن ننشئ مجلد نسميه database (يمكنك تغير الاسم) داخله ننشئ ملف نسميه page.tsx و في هذه الحالة لا يجب تغير اسم page.tsx لأنه سيصبح غير قابل للتوجيه أو زيارة و هذه من قواعد إطار Next-js

داخل ملف: app/database/page.tsx

نقوم بإنشاء عنصر نسميه أي اسم أنا أسميته Notion و نقوم بإستدعاء الدالة RetriveDatabase في الملف


1724418075330.webp


ماذا تعني @ التي قمنا بإحاظتها بمربع أحمر ترمز للمجلد الرئيسي في المشروع و هذا يرجعنا للسؤال الثامن حيث ان سؤال كان ماذا تريد أن يكون ترميز المجلد الرئيسي ونحن قررنا أن يكون بإعدادت الإفتراضية لهاذا الهيكل و هو @

نفتح المتصفح على localhost:3000/database
تم نأخد نظرة على موجه الأوامر في محرر الكود الخاص بنا فنجد

1724703117422.webp


لو تقوم بتدقيق في هذه البيانات ستجد أنها معلومات على databasenotion
1724439301765.webp


1724432212660.webp

داخلها نجد properties و هي خواص ال database أو يمكنك تسميتها أعمدة ال database
كل خاصية لها إسم و لها id لذلك سننسخ الid و نضعها قي ملف .env
1724439887865.webp
و الأن بنجرب نشئ صفحة داخل ال database
في @/app/lib/actions.ts
نكتب



1724439351489.webp






1724439335677.webp



1724453739878.webp




طبعا ستتسألون من أين أتيت بالكود هذا
طبعا بمساعدة notion api doucemnets

مثل ما قلت لكم سيكون صديقكم طوال رحلة برمجة هذا المشروع

تجدونه في هذا المثال كيف يجب أن يكون الكود
create.page.notion

هذا مثال عن كيف يجب أن تكون الخصائص مكتوبة لنوع العنوان (title)
JSON:
{
  "properties": {
    "Title": {
      "id": "title",
      "type": "title",
      "title": [
        {
          "type": "text",
          "text": {
            "content": "A better title for the page",
            "link": null
          },
          "annotations": {
            "bold": false,
            "italic": false,
            "strikethrough": false,
            "underline": false,
            "code": false,
            "color": "default"
          },
          "plain_text": "This is also not done",
          "href": null
        }
      ]
    }
  }
}

نقوم بمنادة CreateApage function من داخل العنصر الذي أنشأنه داخل مجلد ال database

1724440295831.webp



ندخل من المتصفح على الرابط localhost:3000/database

و نرجع لموقع notion و surprise


1724440528232.webp






لنقم بتمرير ال tags
مثال عن ال كيفية تمرير ال tags


1724453898895.webp




لكن سنقوم بتغيير من شكله ليصبح بإستطاعتنا غدخال ال tags كا مدخل للدالة

بتفكير منطقي يجب علينا إدخال مصفوفة تحتوي على ال tags
تم نقوم ب دوران حول هذه المصفوفة لإرسال هذه tags
كما هو موضح بصورة


1724455510097.webp



map loop
ماهو الفرق بينها و بين for loop

map loop :
تستخدم في غالب الأححيان لتعديل مصفوفة وإرجاع مصفوفة جديدة تحتوي القيم الجديدة

مثلا محاولة تحويل مصفوفة تحتوي على أرقام إلى مصفوفة تحتوي على مربع تلك الأرقام

JavaScript:
const numbers:number[] = [1,2,3,4,5,6]

const sqnumbers = numbers.map((number:number ): number=>number*number)


لكن FOR LOOP
لها إستخدمات كثيرة و إستخدامها يكون يدويا أكثر مقارنة ب MAP LOOP


المهم نرجع إلى ملف PAGE.TSX في مجلد ال DATABASE

و نقوم بتعديل على منادة الدالة حيث ستأخد ك مدخل ثاني مصفوفة من ال TAGS

1724456290693.webp


نقوم بزيارة المتصفح على اللينك localhost:3000/database

فنجد أن




1724456404917.webp




بقى فقط ال child blocks


طريقة إضافتها



1724527107504.webp


طبعا شكل البيانات أخدته من notion api
من خلال الرابط
notion.api.blocks

مثال عن العناوين من موقع

JSON:
{
  //...other keys excluded
  "type": "heading_1",
  //...other keys excluded
  "heading_1": {
    "rich_text": [{
      "type": "text",
      "text": {
        "content": "Lacinato kale",
        "link": null
      }
    }],
    "color": "default",
    "is_toggleable": false
  }
}




مثال عن الفقرات

JSON:
{
  //...other keys excluded
  "type": "paragraph",
  //...other keys excluded
  "paragraph": {
    "rich_text": [{
      "type": "text",
      "text": {
        "content": "Lacinato kale",
        "link": null
      }
    }],
    "color": "default"
}



الأن قم بإكمال الكود بحيث يكون
عنةان رئيسي لون غلافة احمر محتواه negative things
فقرة بلون الأحمر محتواه سيكون مخزن داخل متغير إسمه things.negative_things
عنوان الرئيسي لونه أزرق محتواه other
فقرة بلون default بيكون مخزن داخل متغير things.other


things بيكون مدخل الدالة الثالث لذلك ستحتاج تغيير توقيع الدالة

لذلك سيكون بشكل الأتي


JavaScript:
export async function CreateApage({ title, tags ,things}: { title: string, tags:string[] ,things:child_block_data_type}) { ....}

أو


JavaScript:
export async function CreateApage({ title, tags ,things}: { title: string, tags:string[] ,things:{
        negative_things: string|null,
        positive_things: string|null,
        other:string|null
    }}) { ...}



أما عن البيانات فأصل أن تكون بشكل الأتي


JSON:
{
        "type": "heading_1",
        "heading_1": {
          "rich_text": [{
            "type": "text",
            "text": {
              "content": "positive things",
              "link": null
            }
          }],
          "color"  :  "green_background"  as color,
          "is_toggleable": false
        }
      },
      {
 
        object: 'block',
        type: 'paragraph',
        paragraph: {
          rich_text:[
            {
            "type": "text",
            "text": {
              "content": things.positive_things,
              "link": null
            },
            "annotations": {
              "color":"green"
            },
            }] as rich_text_type
        }
      },
      {
        "type": "heading_1",
        "heading_1": {
          "rich_text": [{
            "type": "text",
            "text": {
              "content":"negative things",
              "link": null
            }
          }],
          "color": "red_background" as color,
          "is_toggleable": false
        }
      },
      {
 
        object: 'block',
        type: 'paragraph',
        paragraph: {
          rich_text:[
            {
            "type": "text",
            "text": {
              "content": things.negative_things,
              "link": null
            },
            "annotations": {
              "color":"red"

            },
  
  
            }] as rich_text_type
        }
      },{
        "type": "heading_1",
        "heading_1": {
          "rich_text": [{
            "type": "text",
            "text": {
              "content": "other",
              "link": null
            }
          }],
          "color": "blue" as color,
          "is_toggleable": false
        }
      },
      {
 
        object: 'block',
        type: 'paragraph',
        paragraph: {
          rich_text:[
            {
            "type": "text",
            "text": {
              "content": things.other,
              "link": null
            },
            "annotations": {
              "color": "default"
            },
  
  
            }] as rich_text_type
        }
      }



نقوم بمناداة الدالة من الملف

page.tsx داخل مجلد database


JavaScript:
 CreateApage({ title: "just a test", tags: ["some ", "random ", "words"], things: { positive_things: "just a test ", negative_things: "just a another test ", other: "just to make sure verthing works fine"} })

ندحل من متصفح على ال localhost:3000/database

تم نزور موقع notion فنجد



1724528367086.webp



و الأن بقي إستخراج الصفحات



1724624930440.webp



طبعا سنستخدم ال sort لترتيب البيانات بناء على شئ

1724625258918.webp


فنتيجة ستكون بشكل الأتي



1724625527332.webp



النتيجة

1724625874550.webp
طبعا توجد العديد من المعلومات التي لن نحتاجها في مشورعنا لذلك سنقوم بتبسيط البيانات
نلاحظ أن بينات عبارة عن structure
لدخول لمعلومات نحتاج نكتب إسم ال structure ثم نقطة تم إسم المعلومة

مثال لدينا structure إسمها student نريد الحصول على معلمة الإسم name فنكتب student.name

للشرح كتبت المثال الأتي
JavaScript:
export function student() {
  const student = {
    name:"mohamed",
    firstname: "sumbel",
    job: "cat",
    workplace:"memes",
  }
  console.log(student.name)
  console.log(student.firstname)
  console.log(student.job)
  console.log(student.workplace)

}


طبعا التنيجة ستكون
Bash:
mohamed
sumbel
cat
memes




1724675155656.webp



بإستخدام هذا المعلموات يمكننا الأن أخد البينات التي نحتاجها

فالشئ الذي سنقوم به الأن أخد مصفوفة res.results
وإرجاع مصفوفة أخرى تحتوي على البيانت المهمة و التي ستكون تاريخ إناشاء تاريخ التعديل إسم الصفحة و tags الصفحة و معرف الصفحة بالتأكيد



1724676913800.webp




,و هذه هي دالة ال GetTags




JavaScript:
function GetTags(result:any) {
  const Tags = result.properties.Tags.multi_select.map((tag: any) => {
    return {
      id: tag.id, name: tag.name
    }
  })
  return Tags;
}


طبعا إلى هنا إنتهى الجزء الأول من المشروع بقي جزء ال ui و تعديل هذه الدوال قليلا و إذافة دوال أخرى


لكن بقي بعض أشياء التي لم نتطرق إليها مثل tailwind css فرق بين typescript و javascript و أيضا موضوع approuter و مواضيع أخرى
,و هذه أشياء سنتطرق إليها في الجزء الثاني إن شاء الله

أي خطأ في مقالة يرجى التبليغ عنه لإصلاحه




و السلام عليكم
 

المرفقات

  • 1724335539863.webp
    1724335539863.webp
    138.8 KB · المشاهدات: 92
  • 1724336034430.webp
    1724336034430.webp
    69.8 KB · المشاهدات: 91
  • 1724336366120.webp
    1724336366120.webp
    142.5 KB · المشاهدات: 94
  • 1724338190752.webp
    1724338190752.webp
    26.2 KB · المشاهدات: 92
  • 1724417076929.webp
    1724417076929.webp
    50.2 KB · المشاهدات: 92
  • 1724418754396.webp
    1724418754396.webp
    59.1 KB · المشاهدات: 92
  • 1724431887369.webp
    1724431887369.webp
    69.5 KB · المشاهدات: 94
  • 1724431906640.webp
    1724431906640.webp
    70.8 KB · المشاهدات: 91
  • 1724439192827.webp
    1724439192827.webp
    72.3 KB · المشاهدات: 92
  • 1724625652078.webp
    1724625652078.webp
    53.1 KB · المشاهدات: 90
  • 1724625831585.webp
    1724625831585.webp
    48.8 KB · المشاهدات: 95
التعديل الأخير بواسطة المشرف:

السلام عليكم و رحمة الله و بركاته

اليوم سنجرب صنع واجهة برمجة التطبيقات (API) لموقع NOTION

ماهو واجهة برجمة التطبيقات أو API :

ان API ببساطة هو مجموعة من البرمجيات التى تسمج لتطبيقين مختلفين التواصل والتفاعل مع بعضهم البعض.
عند استخدام API، يمكن للمطورين استخدام وظائف محددة أو الحصول على بيانات محددة من تطبيق آخر أو خدمة ويب دون الحاجة إلى معرفة كامل التفاصيل عن كيفية عمل هذا التطبيق أو الخدمة. وبالتالي، يمكن للمطورين بناء تطبيقات جديدة تعتمد على البيانات أو الخدمات التي توفرها API بدلاً من إعادة بناء كل هذه الوظائف من الصفر (التعريف من موقع </مطور>)

ف ال api بكل بساطة هو مكان أرسل فيه طلب لبيانات فيرسلها لي إذا كان موجودة قد تكون ببصيغة json (أكثر شهرة) أو xml أو yaml (أقل شهرة)​

لماذا أريد صنع ِAPI لهاذا الموقع :

- أكتب ملاحظات شخصية يومية

- أشفر الملاحظات الشخصية قبل ما أحطها بالموقع

المشرولع سيكون بلغة typescript مع Next framework


لذلك ستحتاج إلى

node package manager

Operating systems: macOS, Windows (including WSL), or Linux

text editor like vsc

بسم الله

أول شئ سنحتاجه إنشاء مشروع next-js و ده راح يكون بإستخدام الأمر التالي
npx create-next-app@latest

سيسألنا أسئلة غريبة

What is your project named? notion-api
Would you like to use TypeScript? No / Yes
Would you like to use ESLint? No / Yes
Would you like to use Tailwind CSS? No / Yes
Would you like your code inside a `src/` directory? No / Yes
Would you like to use App Router? (recommended) No / Yes
Would you like to use Turbopack for `next dev`? No / Yes
Would you like to customize the import alias (`@/*` by default)? No / Yes

سؤال أول عن ماذا ستسمي مشروعك
الثاني هل ستسخدم typescript و نعم سنستخدمه وسنشرح فرق بينه و بين javascript
الثالث هل ستسخدم eslint و هي اضافة بتحدد أخطاء و التحذيرات في مشروعك و سنتكلم عليها بإذن الله
الرابع هل ستسخدم tailwind و هو framework csss و نعم سنستخدمه في هذا المشروع و سنشرح بعض تفاصيله
الخامس هل تريد أن يكون المشروع أو أكواد المشروع داخل ملف src لا و ماعندي سبب
السادس هل ستسخدم إضافة App Router نعم وسنشرح بعض تفاصيلها إن شاء الله
السابع هل ستسخدم إضافة turbopack هذه إضافة هي bundler جديد صمم ليكون بديلا عن webpack في هذا المشروع بنستخدم webpack لذلك سأجيب ب لا
ال bundler هو أداة التي تترجم ملفات المشروع و أكواد ال css ,js الخ إلى موقع أو تطبيق
و أشهرهم كما قلنا هو ال webpack
مشاهدة المرفق 12742الثامن سيكون غريبا لو ترحمته لذلك سنتطرق إليه في وسط الشرح بإذن الله
في أخير سيكون لدينا ملف إسمه notion-api و ستكون داخله ملفات المشروع



ثاني شئ سيكون رحلة البحث عن notion api سيكون لموقع notion api's و نحن سننستخدمهم

هذا هو الموقع
devs.notion


مشاهدة المرفق 12744

هذا سيكون صديقنا طوال المشروع
أول شئ يطلب منا هو internal integration


internal integration هو الذي سيتيح لنا التواصل مع صفاحتنا بالموقع فلإتمام هذه العملية سنطلب توكن من الموقع و سيتيح لنا من خلاله التواصل مع الموقع
سندخل لهذه الصفحة
notion.integration
تم سنظغط new intgration


مشاهدة المرفق 12745





مشاهدة المرفق 12746

internal integration : مصممة لأشخاص المسؤول هو الذي يحددهم أي أنها مثالية عندما تكون مع فريق أو وحدك
external integration :مصممة لجمهور أوسع و أي شخص لديه حساب في notion يستطيع إنضمام


ندخل ل manage settings
مشاهدة المرفق 12747



نقوم بالرجوع للمشروع ننشئ ملف نسميه .env
و نكتب فيه إسم env var و نقوم بلصق توكن ال intgration
مشاهدة المرفق 12748

ندخل على موقع notion تم على صفحة التي نريد صنع الواجهة لها تم كما هو موضح في الصورة


مشاهدة المرفق 12828

هذا سيتيح لأي شخص لديه التوكن حق integration أن يعدل على الصفحة


سندخل على وثائق الموقع بذات في retrieve a database
retrieve.database.notion

مشاهدة المرفق 13069




نقوم بالرجوع على مشروعنا
نكتب الأمر التالي
npm run dev


مشاهدة المرفق 12791


بيظهر لنا أن المشروع بدأ في الينك الأتي على المنفذ 3000 نقوم بدخول إليه


مشاهدة المرفق 12792



تظهر لنا هذه الواجهة يمكنك إلقاء النظرة عليها لأنها تحتوي على روابط قد تكون مفيدة لمن يريد تعلم هذا الإطار

نرجع لمححر الأكواد

نقوم بالدخول على مجلد app تم ملف page.tsx و نقوم بمسح كل شئ


أول شئ نكتبه

مشاهدة المرفق 12798



نعيد فتح المتصفح على المنفذ 3000 فسنرى أن



مشاهدة المرفق 12800

داخل مجلد app نفتح مجلد نسميه lib ننشئ ملف نسميه action.ts

و نقوم بلصق الكود الذي أخدنه من وثائق موقع notion

مشاهدة المرفق 12802


نرجع لملف .env


ننشئ env var نسميه databaseID و نعطيه قيمة معرف الصفحة التي نسخها من رابط الموقع

مشاهدة المرفق 12803


تم


مشاهدة المرفق 12804





نرجع لملف app/lib/actions.ts

و نقوم بتغيرات بسيطة كما هي موضحة بالصور



مشاهدة المرفق 12805

مشاهدة المرفق 13071

نشرح المصطلحات التي تم تستطير عليها بالأصفر
[COLOR=rgb(247, 218, 100)]require('@notionhq/client');[/COLOR]

هذا يعني أنه سنحتاج إلى مكتبة إسمها @notionhq/client لذلك سنقوم بتنزيلها بإستعمال الأمر التالي

[COLOR=rgb(19, 182, 41)]npm install @notionhq/client[/COLOR]
function async :هي دوال التي تقدم نتائجها بشكل غير متزامن أي أنها لا تعتمد على دالة أخرى فيمكن للبرنامج تشغيلها و تشغيل أخرى بنفس الوقت

await keyword :يجعل الدالة تتوقف حتى تأخد نتيجة تم تستمر
console.log: هي الدالة التي تقوم بطباعة الأشياء مثل Print في python أو printf في c أو C++ أو ECHO في php ومررنا لها الثابث response الذي سرطرنا تحته بالأزرق
و الأن ننشئ مجلد نسميه database (يمكنك تغير لإسم) داخله ننشئ ملف نسميه page.tsx و في هذه الحالة لا يجب تغير إسم page.tsx لأنه سيصبح غير قابل للتوجيه أو زيارة و هذه من قواعد إطار Next-js

داخل ملف
app/database/page.tsx

نقوم بإنشاء عنصر نسميه أي إسم أنا أسميته Notion

و نقوم بإستدعاء الدالة RetriveDatabase في الملف

مشاهدة المرفق 12830

ماذا تعني @ التي قمنا بإحاظتها بمربع أحمر ترمز للمجلد الرئيسي في المشروع و هذا يرجعنا للسؤال الثامن حيث ان سؤال كان ماذا تريد أن يكون ترميز المجلد الرئيسي ونحن قررنا أن يكون بإعدادت الإفتراضية لهاذا الهيكل و هو @

نفتح المتصفح على localhost:3000/database
تم نأخد نظرة على موجه الأوامر في محرر الكود الخاص بنا فنجد

مشاهدة المرفق 13070

لو تقوم بتدقيق في هذه البيانات ستجد أنها معلومات على databasenotion
مشاهدة المرفق 12839

مشاهدة المرفق 12835
داخلها نجد properties و هي خواص ال database أو يمكنك تسميتها أعمدة ال database
كل خاصية لها إسم و لها id لذلك سننسخ الid و نضعها قي ملف .env
مشاهدة المرفق 12844و الأن بنجرب نشئ صفحة داخل ال database
في @/app/lib/actions.ts
نكتب



مشاهدة المرفق 12841





مشاهدة المرفق 12840


مشاهدة المرفق 12881



طبعا ستتسألون من أين أتيت بالكود هذا
طبعا بمساعدة notion api doucemnets

مثل ما قلت لكم سيكون صديقكم طوال رحلة برمجة هذا المشروع

تجدونه في هذا المثال كيف يجب أن يكون الكود
create.page.notion

هذا مثال عن كيف يجب أن تكون الخصائص مكتوبة لنوع العنوان (title)
JSON:
{
  "properties": {
    "Title": {
      "id": "title",
      "type": "title",
      "title": [
        {
          "type": "text",
          "text": {
            "content": "A better title for the page",
            "link": null
          },
          "annotations": {
            "bold": false,
            "italic": false,
            "strikethrough": false,
            "underline": false,
            "code": false,
            "color": "default"
          },
          "plain_text": "This is also not done",
          "href": null
        }
      ]
    }
  }
}

نقوم بمنادة CreateApage function من داخل العنصر الذي أنشأنه داخل مجلد ال database

مشاهدة المرفق 12847


ندخل من المتصفح على الرابط localhost:3000/database

و نرجع لموقع notion و surprise


مشاهدة المرفق 12849





لنقم بتمرير ال tags
مثال عن ال كيفية تمرير ال tags


مشاهدة المرفق 12882



لكن سنقوم بتغيير من شكله ليصبح بإستطاعتنا غدخال ال tags كا مدخل للدالة

بتفكير منطقي يجب علينا إدخال مصفوفة تحتوي على ال tags
تم نقوم ب دوران حول هذه المصفوفة لإرسال هذه tags
كما هو موضح بصورة


مشاهدة المرفق 12888


map loop
ماهو الفرق بينها و بين for loop

map loop :
تستخدم في غالب الأححيان لتعديل مصفوفة وإرجاع مصفوفة جديدة تحتوي القيم الجديدة

مثلا محاولة تحويل مصفوفة تحتوي على أرقام إلى مصفوفة تحتوي على مربع تلك الأرقام

JavaScript:
const numbers:number[] = [1,2,3,4,5,6]

const sqnumbers = numbers.map((number:number ): number=>number*number)


لكن FOR LOOP
لها إستخدمات كثيرة و إستخدامها يكون يدويا أكثر مقارنة ب MAP LOOP


المهم نرجع إلى ملف PAGE.TSX في مجلد ال DATABASE

و نقوم بتعديل على منادة الدالة حيث ستأخد ك مدخل ثاني مصفوفة من ال TAGS

مشاهدة المرفق 12889

نقوم بزيارة المتصفح على اللينك localhost:3000/database

فنجد أن




مشاهدة المرفق 12890



بقى فقط ال child blocks


طريقة إضافتها



مشاهدة المرفق 12917

طبعا شكل البيانات أخدته من notion api
من خلال الرابط
notion.api.blocks

مثال عن العناوين من موقع

JSON:
{
  //...other keys excluded
  "type": "heading_1",
  //...other keys excluded
  "heading_1": {
    "rich_text": [{
      "type": "text",
      "text": {
        "content": "Lacinato kale",
        "link": null
      }
    }],
    "color": "default",
    "is_toggleable": false
  }
}




مثال عن الفقرات

JSON:
{
  //...other keys excluded
  "type": "paragraph",
  //...other keys excluded
  "paragraph": {
    "rich_text": [{
      "type": "text",
      "text": {
        "content": "Lacinato kale",
        "link": null
      }
    }],
    "color": "default"
}



الأن قم بإكمال الكود بحيث يكون
عنةان رئيسي لون غلافة احمر محتواه negative things
فقرة بلون الأحمر محتواه سيكون مخزن داخل متغير إسمه things.negative_things
عنوان الرئيسي لونه أزرق محتواه other
فقرة بلون default بيكون مخزن داخل متغير things.other


things بيكون مدخل الدالة الثالث لذلك ستحتاج تغيير توقيع الدالة

لذلك سيكون بشكل الأتي


JavaScript:
export async function CreateApage({ title, tags ,things}: { title: string, tags:string[] ,things:child_block_data_type}) { ....}

أو


JavaScript:
export async function CreateApage({ title, tags ,things}: { title: string, tags:string[] ,things:{
        negative_things: string|null,
        positive_things: string|null,
        other:string|null
    }}) { ...}



أما عن البيانات فأصل أن تكون بشكل الأتي


JSON:
{
        "type": "heading_1",
        "heading_1": {
          "rich_text": [{
            "type": "text",
            "text": {
              "content": "positive things",
              "link": null
            }
          }],
          "color"  :  "green_background"  as color,
          "is_toggleable": false
        }
      },
      {
 
        object: 'block',
        type: 'paragraph',
        paragraph: {
          rich_text:[
            {
            "type": "text",
            "text": {
              "content": things.positive_things,
              "link": null
            },
            "annotations": {
              "color":"green"
            },
            }] as rich_text_type
        }
      },
      {
        "type": "heading_1",
        "heading_1": {
          "rich_text": [{
            "type": "text",
            "text": {
              "content":"negative things",
              "link": null
            }
          }],
          "color": "red_background" as color,
          "is_toggleable": false
        }
      },
      {
 
        object: 'block',
        type: 'paragraph',
        paragraph: {
          rich_text:[
            {
            "type": "text",
            "text": {
              "content": things.negative_things,
              "link": null
            },
            "annotations": {
              "color":"red"

            },
  
  
            }] as rich_text_type
        }
      },{
        "type": "heading_1",
        "heading_1": {
          "rich_text": [{
            "type": "text",
            "text": {
              "content": "other",
              "link": null
            }
          }],
          "color": "blue" as color,
          "is_toggleable": false
        }
      },
      {
 
        object: 'block',
        type: 'paragraph',
        paragraph: {
          rich_text:[
            {
            "type": "text",
            "text": {
              "content": things.other,
              "link": null
            },
            "annotations": {
              "color": "default"
            },
  
  
            }] as rich_text_type
        }
      }



نقوم بمناداة الدالة من الملف

page.tsx داخل مجلد database


JavaScript:
 CreateApage({ title: "just a test", tags: ["some ", "random ", "words"], things: { positive_things: "just a test ", negative_things: "just a another test ", other: "just to make sure verthing works fine"} })

ندحل من متصفح على ال localhost:3000/database

تم نزور موقع notion فنجد



مشاهدة المرفق 12920


و الأن بقي إستخراج الصفحات



مشاهدة المرفق 13052


طبعا سنستخدم ال sort لترتيب البيانات بناء على شئ

مشاهدة المرفق 13053

فنتيجة ستكون بشكل الأتي



مشاهدة المرفق 13055


النتيجة

مشاهدة المرفق 13058طبعا توجد العديد من المعلومات التي لن نحتاجها في مشورعنا لذلك سنقوم بتبسيط البيانات
نلاحظ أن بينات عبارة عن structure
لدخول لمعلومات نحتاج نكتب إسم ال structure ثم نقطة تم إسم المعلومة

مثال لدينا structure إسمها student نريد الحصول على معلمة الإسم name فنكتب student.name

للشرح كتبت المثال الأتي
JavaScript:
export function student() {
  const student = {
    name:"mohamed",
    firstname: "sumbel",
    job: "cat",
    workplace:"memes",
  }
  console.log(student.name)
  console.log(student.firstname)
  console.log(student.job)
  console.log(student.workplace)

}


طبعا التنيجة ستكون
Bash:
mohamed
sumbel
cat
memes




مشاهدة المرفق 13064


بإستخدام هذا المعلموات يمكننا الأن أخد البينات التي نحتاجها

فالشئ الذي سنقوم به الأن أخد مصفوفة res.results
وإرجاع مصفوفة أخرى تحتوي على البيانت المهمة و التي ستكون تاريخ إناشاء تاريخ التعديل إسم الصفحة و tags الصفحة و معرف الصفحة بالتأكيد



مشاهدة المرفق 13065



,و هذه هي دالة ال GetTags




JavaScript:
function GetTags(result:any) {
  const Tags = result.properties.Tags.multi_select.map((tag: any) => {
    return {
      id: tag.id, name: tag.name
    }
  })
  return Tags;
}


طبعا إلى هنا إنتهى الجزء الأول من المشروع بقي جزء ال ui و تعديل هذه الدوال قليلا و إذافة دوال أخرى


لكن بقي بعض أشياء التي لم نتطرق إليها مثل tailwind css فرق بين typescript و javascript و أيضا موضوع approuter و مواضيع أخرى
,و هذه أشياء سنتطرق إليها في الجزء الثاني إن شاء الله

أي خطأ في مقالة يرجى التبليغ عنه لإصلاحه




و السلام عليكم
بسم الله ما شاء الله لا قوة الا بالله
موضوع مميز ورائع ويعبي الدماغ والشرح رائع ومميز وواضح جداً
ياخي والله زمان عن هذا النوع من الشروحات
بارك الله فيك حبيبنا وجزاك الله كل خير

ننتظر جديدك دائماً
اخوك ستورم
 
  • Love
التفاعلات: ibada

آخر المشاركات

فانوس

رمضان
عودة
أعلى