Skip to content

Commit 5bb623f

Browse files
authored
Merge branch 'main' into pinkesh/supabase-or-filter
2 parents 30f9f4e + e15ad25 commit 5bb623f

File tree

9 files changed

+206
-28
lines changed

9 files changed

+206
-28
lines changed

docs/ff-concepts/animations/implicit_animations.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Here are some examples of how it looks when you update the widget properties wit
2525
| **Text** | ![Without Implicit Animation](animation_gifs/without-implicit-animation-text.gif) | ![Wit Implicit Animation](animation_gifs/with-implicit-animation-text.gif) |
2626

2727

28-
Here's an exammple of how you add the Implicit Animation on Container widget:
28+
Here's an example of how you add the Implicit Animation on Container widget:
2929
<div style={{
3030
position: 'relative',
3131
paddingBottom: 'calc(56.67989417989418% + 41px)', // Keeps the aspect ratio and additional padding
@@ -50,4 +50,4 @@ Here's an exammple of how you add the Implicit Animation on Container widget:
5050
allow="clipboard-write">
5151
</iframe>
5252
</div>
53-
<p></p>
53+
<p></p>

docs/ff-integrations/authentication/supabase-auth/auth-actions.md

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ Here’s how you can add the Supabase reset password feature to your app:
104104

105105
1. On the **ForgotPassword Page**, add the **Send Reset Password Email** action and set the **Email Field** dropdown to the widget that accepts the user's email address. This action will send the reset password link to the provided email.
106106
2. The reset link sent to the user will open the **UpdatePassword Page**. On that page, add the **Update Password** action and set the **Password Field** and **Confirm Password Field** to the respective input widgets.
107-
3. Copy the route name of the **UpdatePassword Page** and paste it into the **Supabase Dashboard > Authentication > Email Templates > Reset Password > Source**. After **`"{{ .ConfirmationURL}}"`** add **`"/[here]"`** only if you're not using a custom redirect URL. If using a custom redirect URL, the confirmation URL will redirect directly to your specified path.
107+
3. Copy the route name of the **UpdatePassword Page** and paste it into the **Supabase Dashboard > Authentication > Email Templates > Reset Password > Source**. After **`"{{ .ConfirmationURL}}"`** add **`"/[here]"`** only if you're not using a [custom redirect URL](#use-custom-redirect-urls). If using a custom redirect URL, the confirmation URL will redirect directly to your specified path.
108108
4. [Deploy your app to the web](../../../testing-deployment-publishing/publishing/web-publishing.md).
109109
5. Copy the URL of your deployed project and paste it into the **Supabase Dashboard > Authentication > URL Configuration > Site URL**.
110110

@@ -140,7 +140,41 @@ Here’s how you can add the Supabase reset password feature to your app:
140140
</div>
141141
<p></p>
142142

143+
### Use Custom Redirect URLs
143144

145+
Instead of relying on the default `{{ .ConfirmationURL }}` path, you could optionally configure a **custom redirect URL** in Supabase. This option allows you to bypass the default setup and send users directly to a custom page in your app for resetting their password.
146+
147+
To configure a custom redirect URL:
148+
149+
1. When adding the **Send Reset Password Email** action in FlutterFlow, enter the **Redirect To** URL. For example `http://my-site.com/resetPassword`.
150+
2. Whitelist this custom URL by navigating to **Supabase Dashboard > Authentication > URL Configuration > Redirect URL**, and click **Add URL** to include it.
151+
3. Update the reset password template. Go to **Supabase Dashboard > Authentication > Email Templates > Reset Password > Source** and ensure only `{{ .ConfirmationURL }}` is present in the template (remove any appended route names).
152+
153+
<div style={{
154+
position: 'relative',
155+
paddingBottom: 'calc(56.67989417989418% + 41px)', // Keeps the aspect ratio and additional padding
156+
height: 0,
157+
width: '100%'}}>
158+
<iframe
159+
src="https://demo.arcade.software/TaAYPINhn20QEgR6TR5F?embed&show_copy_link=true"
160+
title=""
161+
style={{
162+
position: 'absolute',
163+
top: 0,
164+
left: 0,
165+
width: '100%',
166+
height: '100%',
167+
colorScheme: 'light'
168+
}}
169+
frameborder="0"
170+
loading="lazy"
171+
webkitAllowFullScreen
172+
mozAllowFullScreen
173+
allowFullScreen
174+
allow="clipboard-write">
175+
</iframe>
176+
</div>
177+
<p></p>
144178

145179
## Delete User
146180

docs/marketplace/creators-hub/submit-item-for-reivew.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ In order to submit an item, it must be inside of a project that has been Set For
3030

3131
To set a project for Marketplace:
3232

33-
1. Select the [**Share Icon**](../../intro/ff-ui/toolbar.md#share-project) from the Toolbar (top right side of the screen).
34-
2. Select **Create New Item > Set For Marketplace > Yes**
33+
1. Prerequisite: please enroll as a Marketplace creator first by setting up a profile in [Marketplace](https://marketplace.flutterflow.io/profile). You can optionally also apply to become a paid creator, which allows you to monetize your items.
34+
2. Select the [**Share Icon**](../../intro/ff-ui/toolbar.md#share-project) from the Toolbar (top right side of the screen). Please note that you must be the project owner to see this icon and to submit an item.
35+
3. Select **Create New Item > Set For Marketplace > Yes**
3536

3637
:::tip
3738
You can also clone an existing project and then set it as a Marketplace Project.
@@ -42,7 +43,7 @@ You can also clone an existing project and then set it as a Marketplace Project.
4243
paddingBottom: 'calc(56.67989417989418% + 41px)', // Keeps the aspect ratio and additional padding
4344
height: 0,
4445
width: '100%'}}>
45-
<iframe
46+
<iframe
4647
src="https://www.loom.com/embed/238389017ff242db9e1e81c665f0dd16?sid=c227f4ad-9851-4a79-acde-2ff0b6fa6324"
4748
title=""
4849
style={{
@@ -98,8 +99,7 @@ Four types of items can be submitted:
9899
- Libraries
99100
- Template Apps
100101
- Template Page or Components
101-
- Custom Code
102-
102+
- Custom Code
103103

104104
<Tabs>
105105
<TabItem value="1" label="Libraries" default>
@@ -148,7 +148,6 @@ Custom Code is Dart code that can be used within FlutterFlow projects. There are
148148
</TabItem>
149149
</Tabs>
150150

151-
152151
#### Template Tags (optional)
153152

154153
Template tags help users sort and filter items. If the tags listed don't match your item, enter your desired search terms under *Keywords*.
@@ -181,6 +180,7 @@ Your item will be shown in your [Dashboard](https://marketplace.flutterflow.io/d
181180
![Item in "Pending Approval"](../imgs/image.avif)
182181

183182
### 4. Edit an approved item
183+
184184
:::info
185185
At this time, it is not possible to edit an approved Marketplace Item. We are working to add this functionality soon.
186-
:::
186+
:::
Lines changed: 134 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
---
22
title: Action Parameters (Callbacks)
33
sidebar_position: 4
4+
tags: [Components, Actions]
5+
keywords: [Components, Actions, Action Parameter, Callbacks]
6+
description: Learn how to add action parameters or callbacks to custom components.
47
---
58

69
# Action Parameters (Callbacks)
@@ -12,6 +15,16 @@ define specific behaviors that the child entity should execute when certain even
1215
It enables dynamic and interactive behavior in child components, allowing them to perform actions
1316
defined by the parent, such as navigation, data updates, or displaying dialogs.
1417

18+
For example, if you have an *image upload component*, the parent can define what should happen after an image is successfully uploaded. Using callbacks, the *image upload component* can execute a parent-defined action, such as:
19+
20+
- Resize and compress the image to reduce storage size.
21+
- Update the user's database record with the new image URL.
22+
- Refresh the UI to display the updated profile picture.
23+
24+
This makes the *image upload component* component reusable, as it doesn't need to know the specifics of what should happen post-upload. Instead, the parent controls the behavior by passing the appropriate actions via a callback.
25+
26+
![action-parameters-callbacks](imgs/action-parameters-callbacks.avif)
27+
1528
:::tip[Benefits of Using Callbacks in FlutterFlow]
1629

1730
- **Modularity:** Separate the logic of what happens when an event occurs from the child component,
@@ -21,35 +34,140 @@ defined by the parent, such as navigation, data updates, or displaying dialogs.
2134
:::
2235

2336

24-
## Creating a Callback Parameter
25-
In order to create a component that will execute a callback, you must create a component with a parameter of type Action.
37+
## Adding Callbacks
38+
39+
Let’s continue with our previous example (*image upload component*) and see how to add callbacks on it:
40+
41+
### Creating a Callback Parameter
42+
43+
In order to create a component that will execute a callback, you must create a component with a parameter of **Type** **Action**. You can create an action parameter called `uploadAction`, which represents the action that will be executed after the image is uploaded.
44+
45+
When you create an action parameter, you can also specify parameters that will be passed into the action. For this example, the action that will be executed will likely need to know the uploaded image URL to process it further. So, you can specify an action parameter called uploadedURL.
46+
47+
Now, the page or component that uses this button can utilize this parameter in its own action flow. An example of this is shown below.
48+
49+
<div style={{
50+
position: 'relative',
51+
paddingBottom: 'calc(56.67989417989418% + 41px)', // Keeps the aspect ratio and additional padding
52+
height: 0,
53+
width: '100%'}}>
54+
<iframe
55+
src="https://demo.arcade.software/BRHcXG6zWBYLCxaa9ifG?embed&show_copy_link=true"
56+
title=""
57+
style={{
58+
position: 'absolute',
59+
top: 0,
60+
left: 0,
61+
width: '100%',
62+
height: '100%',
63+
colorScheme: 'light'
64+
}}
65+
frameborder="0"
66+
loading="lazy"
67+
webkitAllowFullScreen
68+
mozAllowFullScreen
69+
allowFullScreen
70+
allow="clipboard-write">
71+
</iframe>
72+
</div>
73+
<p></p>
74+
75+
### Executing a Callback
76+
77+
You can execute the action passed into the component by using the **Execute Callback** action within the component's action flows.
78+
79+
For example, you can execute the above callback after the image is successfully uploaded and the pass the uploaded image URL into the callback.
80+
2681

27-
When you create an action parameter, you can also specify parameters that will get passed into the action. For example,
28-
you might have a button that allows your app to add an item to a user's cart.
82+
<div style={{
83+
position: 'relative',
84+
paddingBottom: 'calc(56.67989417989418% + 41px)', // Keeps the aspect ratio and additional padding
85+
height: 0,
86+
width: '100%'}}>
87+
<iframe
88+
src="https://demo.arcade.software/XEap1vCGTJ4x9Y1lswe3?embed&show_copy_link=true"
89+
title=""
90+
style={{
91+
position: 'absolute',
92+
top: 0,
93+
left: 0,
94+
width: '100%',
95+
height: '100%',
96+
colorScheme: 'light'
97+
}}
98+
frameborder="0"
99+
loading="lazy"
100+
webkitAllowFullScreen
101+
mozAllowFullScreen
102+
allowFullScreen
103+
allow="clipboard-write">
104+
</iframe>
105+
</div>
106+
<p></p>
29107

30-
You can create a parameter called `onAddToBag` which represents the action that will be executed when the button is tapped.
108+
### Passing in an Action to a Component
31109

32-
The action that will be executed will likely need to know which item is being added to the cart. So, you can also specify an action parameter -
33-
`item`. Now, the page or component that leverages this button can use this parameter in its own action flow. You can see an example of that below.
110+
When you add a component to the widget tree of a page or another component, you can define values for its parameters, including action parameters.
34111

35-
![action-parameters.png](imgs/action-parameters.png)
112+
For instance, when you add an *image upload component*, you can specify the action flows to be executed when the callback is triggered. For this example, we simply update the profile picture.
36113

37-
## Executing a Callback
114+
:::info
38115

39-
You can execute the action that is passed into the component by using the **Execute Callback** action in the component's action flows.
116+
You can access the value passed to the callback by navigating to the **Set Variable** menu > **Callback Parameters**.
40117

41-
For example, you may want to execute the above callback when the button is tapped.
118+
:::
42119

43-
![execute-callback.png](imgs/execute-callback.png)
44120

45-
## Passing in an Action to a Component
121+
<div style={{
122+
position: 'relative',
123+
paddingBottom: 'calc(56.67989417989418% + 41px)', // Keeps the aspect ratio and additional padding
124+
height: 0,
125+
width: '100%'}}>
126+
<iframe
127+
src="https://demo.arcade.software/61EV732tfLpqQAIzLP8G?embed&show_copy_link=true"
128+
title=""
129+
style={{
130+
position: 'absolute',
131+
top: 0,
132+
left: 0,
133+
width: '100%',
134+
height: '100%',
135+
colorScheme: 'light'
136+
}}
137+
frameborder="0"
138+
loading="lazy"
139+
webkitAllowFullScreen
140+
mozAllowFullScreen
141+
allowFullScreen
142+
allow="clipboard-write">
143+
</iframe>
144+
</div>
145+
<p></p>
146+
147+
148+
Now that we have an *image upload component* with action parameters set up, it can be reused across different pages or contexts, as it relies on the parent to define the post-upload logic. For example, the same component can be used to upload an image while posting reviews for a product, eliminating the need to create a separate component for this functionality.
149+
150+
![component-action-parameters.avif](imgs/component-action-parameters.avif)
151+
152+
153+
## More Examples
154+
155+
Let's see some more examples of adding action parameters (callbacks) to deepen the understanding and use it in real-world scenarios.
156+
157+
### Example 1: Dynamic Dialog Component
158+
159+
Let’s take another example of a reusable dialog component that uses callbacks to handle context-specific actions like confirming a deletion, logging out, or saving data. In one context, "Yes" deletes an item. In another, it logs out a user.
46160

47-
When you add a component to the widget tree of a page or another component, you can set values for its parameters.
161+
The specific logic for each action is defined by the parent component or page using the dialog. The dialog itself does not need to know of what should happen—it simply executes the callback passed to it when users click on the "Yes" button.
48162

49-
This holds true for action parameters as well. For example, when you create an instance of the button component mentioned above, you can specify the action flows that should be used when the callback is executed.
163+
![dialog-component-action-parameters.avif](imgs/dialog-component-action-parameters.avif)
50164

51-
![execute-callback.png](imgs/set-action-callback.png)
165+
### Example 2: Custom Navigation Bar in Super App
52166

167+
Using Action Parameters to build a Custom Navigation Bar in a Super App is an excellent way to create a dynamic, reusable, and modular navigation solution. A **Super App** typically hosts multiple mini-apps or features, each requiring specific navigation logic. Action Parameters allows you to define navigation behavior dynamically, depending on the active context, making it perfect for this scenario.
53168

169+
Here, the navigation bar doesn’t require hardcoded routes. Instead, the navigation logic can be customized for each mini-app, allowing the navigation bar to remain focused solely on its UI role.
54170

171+
For example, in an **ecommerce mini-app**, the home button navigates to the product listing page, while the main (middle) button opens the shopping cart. In contrast, in a **cab booking mini-app**, the home button navigates to the dashboard, and the main (middle) button opens the quick booking page.
55172

173+
![navigation-bar-action-parameters.avif](imgs/navigation-bar-action-parameters.avif)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

docs/testing-deployment-publishing/publishing/deploy-for-environment.md

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,35 @@ You can configure and publish environment-specific builds of your app for both i
1818

1919
To set up deployment for different environments, go to **Settings & Integrations > App Settings > Mobile Deployment**, and select the desired environment from the **Current Environment** dropdown on the right side.
2020

21-
To submit an environment-specific build to the App Store and Play Store, you must have unique package names representing each environment. To achieve this, create [environment values](../development-environments/development-environments.md#use-environment-values) for the package name and set it into **Settings & Integrations > General > App Details > Package Name**. This ensures that when you switch environments, the package name changes and you can submit separate builds to the App Store and Play Store.
21+
Now, to submit an environment-specific build to the App Store and Play Store, you must have unique package names representing each environment. To set this up, go to **Settings & Integrations > General > App Details > Package Name**, select the **Current Environment** from the dropdown (on the right), and specify the package name for that environment. This ensures that when you switch environments, the package name changes and you can submit separate builds to the App Store and Play Store.
2222

23-
For example, in an ecommerce app, you can set environment values for package names such as `io.flutterflow.ecommerceflow.dev` for the development environment and `io.flutterflow.ecommerceflow.staging` for the staging environment.
23+
For example, in an ecommerce app, you can set package names such as `io.flutterflow.ecommerceflow.dev` for the development environment and `io.flutterflow.ecommerceflow.staging` for the staging environment.
24+
25+
<div style={{
26+
position: 'relative',
27+
paddingBottom: 'calc(56.67989417989418% + 41px)', // Keeps the aspect ratio and additional padding
28+
height: 0,
29+
width: '100%'}}>
30+
<iframe
31+
src="https://demo.arcade.software/WecD2unE4ERmisWzAVgz?embed&show_copy_link=true"
32+
title=""
33+
style={{
34+
position: 'absolute',
35+
top: 0,
36+
left: 0,
37+
width: '100%',
38+
height: '100%',
39+
colorScheme: 'light'
40+
}}
41+
frameborder="0"
42+
loading="lazy"
43+
webkitAllowFullScreen
44+
mozAllowFullScreen
45+
allowFullScreen
46+
allow="clipboard-write">
47+
</iframe>
48+
</div>
49+
<p></p>
2450

2551
Once this setup is complete, you can deploy to [App Store](apple-appstore-deployment.md) and [Play Store](google-playstore-deployment.md) as usual.
2652

0 commit comments

Comments
 (0)