الانتقال إلى المحتوى الرئيسي
يحتوي مجلد public/ في جذر تطبيقك على ملفات ثابتة — صور وأيقونات وخطوط وأي أصول أخرى يحتاجها تطبيقك وقت التشغيل. تُدرج هذه الملفات تلقائيًا في عمليات البناء، وتُزامَن أثناء وضع التطوير، وتُرفَع إلى الخادم. الملفات الموضوعة في public/ هي:
  • متاحة للعامة — بمجرد مزامنتها إلى الخادم، تُقدَّم الأصول عبر عنوان URL عام. لا حاجة إلى مصادقة للوصول إليها.
  • متاحة في المكوّنات الأمامية — استخدم عناوين الأصول لعرض الصور أو الأيقونات أو أي وسائط داخل مكوّنات React لديك.
  • متاحة في الدوال المنطقية — أشِر إلى عناوين الأصول في رسائل البريد الإلكتروني أو استجابات واجهات البرمجة أو أي منطق على جهة الخادم.
  • مستخدمة لبيانات تعريف السوق — يشير حقلا logoUrl وscreenshots في defineApplication() إلى ملفات من هذا المجلد (مثل public/logo.png). تُعرَض هذه عند نشر تطبيقك في السوق.
  • تُزامَن تلقائيًا في وضع التطوير — عند إضافة ملف في public/ أو تحديثه أو حذفه، تتم مزامنته إلى الخادم تلقائيًا. لا حاجة لإعادة التشغيل.
  • مضمَّنة في عمليات البناء — يقوم yarn twenty dev:build بتجميع جميع الأصول العامة ضمن مخرجات التوزيع.

الوصول إلى الأصول العامة باستخدام getPublicAssetUrl

استخدم المساعد getPublicAssetUrl من twenty-sdk للحصول على العنوان الكامل لملف في دليل public/ لديك. يعمل ذلك في كلٍ من الدوال المنطقية والمكوّنات الأمامية. في دالة منطقية:
src/logic-functions/send-invoice.ts
import { defineLogicFunction } from 'twenty-sdk/define';
import { getPublicAssetUrl } from 'twenty-sdk/utils';

const handler = async (): Promise<any> => {
  const logoUrl = getPublicAssetUrl('logo.png');
  const invoiceUrl = getPublicAssetUrl('templates/invoice.png');

  // Fetch the file content (no auth required — public endpoint)
  const response = await fetch(invoiceUrl);
  const buffer = await response.arrayBuffer();

  return { logoUrl, size: buffer.byteLength };
};

export default defineLogicFunction({
  universalIdentifier: 'a1b2c3d4-...',
  name: 'send-invoice',
  description: 'Sends an invoice with the app logo',
  timeoutSeconds: 10,
  handler,
});
في مكوّن أمامي:
src/front-components/company-card.tsx
import { defineFrontComponent } from 'twenty-sdk/define';
import { getPublicAssetUrl } from 'twenty-sdk/utils';

const CompanyCard = () => {
  const logoUrl = getPublicAssetUrl('logo.png');

  return <img src={logoUrl} alt="App logo" />;
};

export default defineFrontComponent({
  universalIdentifier: '...',
  name: 'company-card',
  component: CompanyCard,
});
وسيطة path نسبية إلى مجلد public/ الخاص بتطبيقك. كلٌّ من getPublicAssetUrl('logo.png') وgetPublicAssetUrl('public/logo.png') يُحلاّن إلى العنوان نفسه — تتم إزالة بادئة public/ تلقائيًا إن وُجدت.