Repository files navigation

This is a wrapper over native verloop's iOS and Android SDK.

You can checkout sample app for any clarification on the usage of the SDK

Getting Started

Here we are adding verloop chat button as a floating action button in the app. You can attach the widget at any other place too

On press is internally handled by the VerloopWidget using onTap of GestureDetector widget

constString _clientId ="ClientID"; // You need to use the name of your organisation herefinalMap<String,String> userVariableMap =Map();
userVariableMap['key1'] ='value1';
finalMap<String,String> roomVariableMap =Map();
roomVariableMap['key2'] ='value2';
Widgetbuild(BuildContext context) {
returnMaterialApp(
home:Scaffold(
appBar:AppBar(
backgroundColor:Colors.black,
title:constText('Plugin example app'),
),
body:Center(
child:Text('Running for client $clientId'),
),
floatingActionButton:FutureBuilder<String?>(
// Initialize FlutterFire
future:FirebaseMessaging.instance.getToken(),
builder: (context, snapshot) {
// Check for errorsif (snapshot.hasError) {
returnconstText("Something went wrong");
}
if (snapshot.hasData && snapshot.data !="") {
String token = snapshot.data ??"";
returnVerloopWidget(
clientId: _clientId, // Required
userId:"<user_id>", // Optional: add this if you want to associate all the chats of this user across the platforms 
recipeId:"<recipe_id>", // Optional: if you wish to use any other recipe apart from the default one, use this
fcmToken: token, // Optional: this would help us to send the notification on the device. You still need to handle the fcm notifications.
userName:"<user_name>", // Optional: This would populate the system variable for user name which would help you identify the user. else the name of the user would be autogenerated like "guest-123"
userEmail:"<user_email>", // Optional: This would populate the system variable for emails
userPhone:"<user_phone>", // Optional: This would populate the system variable for Phone number
userVariables: userVariableMap, // Optional: These are the global variables of the user which is associated with the given userId. These variables would be used by the recipe. These values would spill over to the another room once the current conversation is over.
roomVariables: roomVariableMap, // Optional: These variables would be used by the recipe and will not spill over another room created by the user once the conversation is over
overrideUrlOnClick:false, // Optional: this is by default false, if you don't want the url to open in the browser, and want to handle internally in the app, make it as false
onButtonClicked:// Optional: Add this function callback as a button click listener
(String? title, String? payload, String? type) {
print("button click title $title");
},
onUrlClicked:// Optional: Add this function callback as a url click listener
(String? url) {
print("url clicked $url");
},
child:constFloatingActionButton(
onPressed:null,
child:Icon(Icons.chat),
),
);
}
returnconstText("Loading...");
},
),
),
);
}

Button click listeners

These button are defined as a part of the conversational flow. Once the user clicks the button, you can listen to the events in your flutter app. A very common use case for this is navigating the user to another section of the app if button is clicked inside the recipe. Note: Button which contains url would be treated as button instead of the url. Hence, you'll get callback on onButtonClicked if implemented

VerloopWidget(
clientId:<client_id>, // Required
onButtonClicked:
(String? title, String? payload, String? type) {
print("button click title $title");
},
child:<SomeWidget>,
);

Url click listeners

These urls are defined as a part of the conversational flow. Once the user clicks the url, you can listen to the events in your flutter app.

You can choose whether to open the url in mobile browser or handle it in the app by setting overrideUrlOnClick field. If overrideUrlOnClick is true, we will not open the url anywhere but you'll get a callback on onUrlClicked function.

VerloopWidget(
clientId:<client_id>, // Required
overrideUrlOnClick:false
onUrlClicked:
(String? url) {
print("url clicked $url");
},
child:<SomeWidget>,
);

Handling notifications

follow this https://firebase.google.com/docs/flutter/setup

Once the fcm is setup, just send the fcmToken as a part of VerloopWidget.

NOTE: make sure the server key is added to the verloop's setting page for the same firebase app which is configured in your flutter app.

To Navigate to the verloop's setting page

  • open https://client_id.verloop.io
  • go to settings gear icon on the left navigation panel
  • search for android sdk
  • add the server key as production
  • similarly, go to ios sdk
  • add appropiate files as production configuration

About

This is a wrapper sdk for Flutter over android, ios and web

Resources

Stars

1 star

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

This is a wrapper over native verloop's iOS and Android SDK.

You can checkout sample app for any clarification on the usage of the SDK

Getting Started

Here we are adding verloop chat button as a floating action button in the app. You can attach the widget at any other place too

On press is internally handled by the VerloopWidget using onTap of GestureDetector widget

constString _clientId ="ClientID"; // You need to use the name of your organisation herefinalMap<String,String> userVariableMap =Map();
userVariableMap['key1'] ='value1';
finalMap<String,String> roomVariableMap =Map();
roomVariableMap['key2'] ='value2';
Widgetbuild(BuildContext context) {
returnMaterialApp(
home:Scaffold(
appBar:AppBar(
backgroundColor:Colors.black,
title:constText('Plugin example app'),
),
body:Center(
child:Text('Running for client $clientId'),
),
floatingActionButton:FutureBuilder<String?>(
// Initialize FlutterFire
future:FirebaseMessaging.instance.getToken(),
builder: (context, snapshot) {
// Check for errorsif (snapshot.hasError) {
returnconstText("Something went wrong");
}
if (snapshot.hasData && snapshot.data !="") {
String token = snapshot.data ??"";
returnVerloopWidget(
clientId: _clientId, // Required
userId:"<user_id>", // Optional: add this if you want to associate all the chats of this user across the platforms 
recipeId:"<recipe_id>", // Optional: if you wish to use any other recipe apart from the default one, use this
fcmToken: token, // Optional: this would help us to send the notification on the device. You still need to handle the fcm notifications.
userName:"<user_name>", // Optional: This would populate the system variable for user name which would help you identify the user. else the name of the user would be autogenerated like "guest-123"
userEmail:"<user_email>", // Optional: This would populate the system variable for emails
userPhone:"<user_phone>", // Optional: This would populate the system variable for Phone number
userVariables: userVariableMap, // Optional: These are the global variables of the user which is associated with the given userId. These variables would be used by the recipe. These values would spill over to the another room once the current conversation is over.
roomVariables: roomVariableMap, // Optional: These variables would be used by the recipe and will not spill over another room created by the user once the conversation is over
overrideUrlOnClick:false, // Optional: this is by default false, if you don't want the url to open in the browser, and want to handle internally in the app, make it as false
onButtonClicked:// Optional: Add this function callback as a button click listener
(String? title, String? payload, String? type) {
print("button click title $title");
},
onUrlClicked:// Optional: Add this function callback as a url click listener
(String? url) {
print("url clicked $url");
},
child:constFloatingActionButton(
onPressed:null,
child:Icon(Icons.chat),
),
);
}
returnconstText("Loading...");
},
),
),
);
}

Button click listeners

These button are defined as a part of the conversational flow. Once the user clicks the button, you can listen to the events in your flutter app. A very common use case for this is navigating the user to another section of the app if button is clicked inside the recipe. Note: Button which contains url would be treated as button instead of the url. Hence, you'll get callback on onButtonClicked if implemented

VerloopWidget(
clientId:<client_id>, // Required
onButtonClicked:
(String? title, String? payload, String? type) {
print("button click title $title");
},
child:<SomeWidget>,
);

Url click listeners

These urls are defined as a part of the conversational flow. Once the user clicks the url, you can listen to the events in your flutter app.

You can choose whether to open the url in mobile browser or handle it in the app by setting overrideUrlOnClick field. If overrideUrlOnClick is true, we will not open the url anywhere but you'll get a callback on onUrlClicked function.

VerloopWidget(
clientId:<client_id>, // Required
overrideUrlOnClick:false
onUrlClicked:
(String? url) {
print("url clicked $url");
},
child:<SomeWidget>,
);

Handling notifications

follow this https://firebase.google.com/docs/flutter/setup

Once the fcm is setup, just send the fcmToken as a part of VerloopWidget.

NOTE: make sure the server key is added to the verloop's setting page for the same firebase app which is configured in your flutter app.

To Navigate to the verloop's setting page

  • open https://client_id.verloop.io
  • go to settings gear icon on the left navigation panel
  • search for android sdk
  • add the server key as production
  • similarly, go to ios sdk
  • add appropiate files as production configuration

About

This is a wrapper sdk for Flutter over android, ios and web

Resources

Stars

1 star

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

This is a wrapper over native verloop's iOS and Android SDK.

You can checkout sample app for any clarification on the usage of the SDK

Getting Started

Here we are adding verloop chat button as a floating action button in the app. You can attach the widget at any other place too

On press is internally handled by the VerloopWidget using onTap of GestureDetector widget

constString _clientId ="ClientID"; // You need to use the name of your organisation herefinalMap<String,String> userVariableMap =Map();
userVariableMap['key1'] ='value1';
finalMap<String,String> roomVariableMap =Map();
roomVariableMap['key2'] ='value2';
Widgetbuild(BuildContext context) {
returnMaterialApp(
home:Scaffold(
appBar:AppBar(
backgroundColor:Colors.black,
title:constText('Plugin example app'),
),
body:Center(
child:Text('Running for client $clientId'),
),
floatingActionButton:FutureBuilder<String?>(
// Initialize FlutterFire
future:FirebaseMessaging.instance.getToken(),
builder: (context, snapshot) {
// Check for errorsif (snapshot.hasError) {
returnconstText("Something went wrong");
}
if (snapshot.hasData && snapshot.data !="") {
String token = snapshot.data ??"";
returnVerloopWidget(
clientId: _clientId, // Required
userId:"<user_id>", // Optional: add this if you want to associate all the chats of this user across the platforms 
recipeId:"<recipe_id>", // Optional: if you wish to use any other recipe apart from the default one, use this
fcmToken: token, // Optional: this would help us to send the notification on the device. You still need to handle the fcm notifications.
userName:"<user_name>", // Optional: This would populate the system variable for user name which would help you identify the user. else the name of the user would be autogenerated like "guest-123"
userEmail:"<user_email>", // Optional: This would populate the system variable for emails
userPhone:"<user_phone>", // Optional: This would populate the system variable for Phone number
userVariables: userVariableMap, // Optional: These are the global variables of the user which is associated with the given userId. These variables would be used by the recipe. These values would spill over to the another room once the current conversation is over.
roomVariables: roomVariableMap, // Optional: These variables would be used by the recipe and will not spill over another room created by the user once the conversation is over
overrideUrlOnClick:false, // Optional: this is by default false, if you don't want the url to open in the browser, and want to handle internally in the app, make it as false
onButtonClicked:// Optional: Add this function callback as a button click listener
(String? title, String? payload, String? type) {
print("button click title $title");
},
onUrlClicked:// Optional: Add this function callback as a url click listener
(String? url) {
print("url clicked $url");
},
child:constFloatingActionButton(
onPressed:null,
child:Icon(Icons.chat),
),
);
}
returnconstText("Loading...");
},
),
),
);
}

Button click listeners

These button are defined as a part of the conversational flow. Once the user clicks the button, you can listen to the events in your flutter app. A very common use case for this is navigating the user to another section of the app if button is clicked inside the recipe. Note: Button which contains url would be treated as button instead of the url. Hence, you'll get callback on onButtonClicked if implemented

VerloopWidget(
clientId:<client_id>, // Required
onButtonClicked:
(String? title, String? payload, String? type) {
print("button click title $title");
},
child:<SomeWidget>,
);

Url click listeners

These urls are defined as a part of the conversational flow. Once the user clicks the url, you can listen to the events in your flutter app.

You can choose whether to open the url in mobile browser or handle it in the app by setting overrideUrlOnClick field. If overrideUrlOnClick is true, we will not open the url anywhere but you'll get a callback on onUrlClicked function.

VerloopWidget(
clientId:<client_id>, // Required
overrideUrlOnClick:false
onUrlClicked:
(String? url) {
print("url clicked $url");
},
child:<SomeWidget>,
);

Handling notifications

follow this https://firebase.google.com/docs/flutter/setup

Once the fcm is setup, just send the fcmToken as a part of VerloopWidget.

NOTE: make sure the server key is added to the verloop's setting page for the same firebase app which is configured in your flutter app.

To Navigate to the verloop's setting page

  • open https://client_id.verloop.io
  • go to settings gear icon on the left navigation panel
  • search for android sdk
  • add the server key as production
  • similarly, go to ios sdk
  • add appropiate files as production configuration

About

This is a wrapper sdk for Flutter over android, ios and web

Resources

Stars

1 star

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

This is a wrapper over native verloop's iOS and Android SDK.

You can checkout sample app for any clarification on the usage of the SDK

Getting Started

Here we are adding verloop chat button as a floating action button in the app. You can attach the widget at any other place too

On press is internally handled by the VerloopWidget using onTap of GestureDetector widget

constString _clientId ="ClientID"; // You need to use the name of your organisation herefinalMap<String,String> userVariableMap =Map();
userVariableMap['key1'] ='value1';
finalMap<String,String> roomVariableMap =Map();
roomVariableMap['key2'] ='value2';
Widgetbuild(BuildContext context) {
returnMaterialApp(
home:Scaffold(
appBar:AppBar(
backgroundColor:Colors.black,
title:constText('Plugin example app'),
),
body:Center(
child:Text('Running for client $clientId'),
),
floatingActionButton:FutureBuilder<String?>(
// Initialize FlutterFire
future:FirebaseMessaging.instance.getToken(),
builder: (context, snapshot) {
// Check for errorsif (snapshot.hasError) {
returnconstText("Something went wrong");
}
if (snapshot.hasData && snapshot.data !="") {
String token = snapshot.data ??"";
returnVerloopWidget(
clientId: _clientId, // Required
userId:"<user_id>", // Optional: add this if you want to associate all the chats of this user across the platforms 
recipeId:"<recipe_id>", // Optional: if you wish to use any other recipe apart from the default one, use this
fcmToken: token, // Optional: this would help us to send the notification on the device. You still need to handle the fcm notifications.
userName:"<user_name>", // Optional: This would populate the system variable for user name which would help you identify the user. else the name of the user would be autogenerated like "guest-123"
userEmail:"<user_email>", // Optional: This would populate the system variable for emails
userPhone:"<user_phone>", // Optional: This would populate the system variable for Phone number
userVariables: userVariableMap, // Optional: These are the global variables of the user which is associated with the given userId. These variables would be used by the recipe. These values would spill over to the another room once the current conversation is over.
roomVariables: roomVariableMap, // Optional: These variables would be used by the recipe and will not spill over another room created by the user once the conversation is over
overrideUrlOnClick:false, // Optional: this is by default false, if you don't want the url to open in the browser, and want to handle internally in the app, make it as false
onButtonClicked:// Optional: Add this function callback as a button click listener
(String? title, String? payload, String? type) {
print("button click title $title");
},
onUrlClicked:// Optional: Add this function callback as a url click listener
(String? url) {
print("url clicked $url");
},
child:constFloatingActionButton(
onPressed:null,
child:Icon(Icons.chat),
),
);
}
returnconstText("Loading...");
},
),
),
);
}

Button click listeners

These button are defined as a part of the conversational flow. Once the user clicks the button, you can listen to the events in your flutter app. A very common use case for this is navigating the user to another section of the app if button is clicked inside the recipe. Note: Button which contains url would be treated as button instead of the url. Hence, you'll get callback on onButtonClicked if implemented

VerloopWidget(
clientId:<client_id>, // Required
onButtonClicked:
(String? title, String? payload, String? type) {
print("button click title $title");
},
child:<SomeWidget>,
);

Url click listeners

These urls are defined as a part of the conversational flow. Once the user clicks the url, you can listen to the events in your flutter app.

You can choose whether to open the url in mobile browser or handle it in the app by setting overrideUrlOnClick field. If overrideUrlOnClick is true, we will not open the url anywhere but you'll get a callback on onUrlClicked function.

VerloopWidget(
clientId:<client_id>, // Required
overrideUrlOnClick:false
onUrlClicked:
(String? url) {
print("url clicked $url");
},
child:<SomeWidget>,
);

Handling notifications

follow this https://firebase.google.com/docs/flutter/setup

Once the fcm is setup, just send the fcmToken as a part of VerloopWidget.

NOTE: make sure the server key is added to the verloop's setting page for the same firebase app which is configured in your flutter app.

To Navigate to the verloop's setting page

  • open https://client_id.verloop.io
  • go to settings gear icon on the left navigation panel
  • search for android sdk
  • add the server key as production
  • similarly, go to ios sdk
  • add appropiate files as production configuration

About

This is a wrapper sdk for Flutter over android, ios and web

Resources

Stars

1 star

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

This is a wrapper over native verloop's iOS and Android SDK.

You can checkout sample app for any clarification on the usage of the SDK

Getting Started

Here we are adding verloop chat button as a floating action button in the app. You can attach the widget at any other place too

On press is internally handled by the VerloopWidget using onTap of GestureDetector widget

constString _clientId ="ClientID"; // You need to use the name of your organisation herefinalMap<String,String> userVariableMap =Map();
userVariableMap['key1'] ='value1';
finalMap<String,String> roomVariableMap =Map();
roomVariableMap['key2'] ='value2';
Widgetbuild(BuildContext context) {
returnMaterialApp(
home:Scaffold(
appBar:AppBar(
backgroundColor:Colors.black,
title:constText('Plugin example app'),
),
body:Center(
child:Text('Running for client $clientId'),
),
floatingActionButton:FutureBuilder<String?>(
// Initialize FlutterFire
future:FirebaseMessaging.instance.getToken(),
builder: (context, snapshot) {
// Check for errorsif (snapshot.hasError) {
returnconstText("Something went wrong");
}
if (snapshot.hasData && snapshot.data !="") {
String token = snapshot.data ??"";
returnVerloopWidget(
clientId: _clientId, // Required
userId:"<user_id>", // Optional: add this if you want to associate all the chats of this user across the platforms 
recipeId:"<recipe_id>", // Optional: if you wish to use any other recipe apart from the default one, use this
fcmToken: token, // Optional: this would help us to send the notification on the device. You still need to handle the fcm notifications.
userName:"<user_name>", // Optional: This would populate the system variable for user name which would help you identify the user. else the name of the user would be autogenerated like "guest-123"
userEmail:"<user_email>", // Optional: This would populate the system variable for emails
userPhone:"<user_phone>", // Optional: This would populate the system variable for Phone number
userVariables: userVariableMap, // Optional: These are the global variables of the user which is associated with the given userId. These variables would be used by the recipe. These values would spill over to the another room once the current conversation is over.
roomVariables: roomVariableMap, // Optional: These variables would be used by the recipe and will not spill over another room created by the user once the conversation is over
overrideUrlOnClick:false, // Optional: this is by default false, if you don't want the url to open in the browser, and want to handle internally in the app, make it as false
onButtonClicked:// Optional: Add this function callback as a button click listener
(String? title, String? payload, String? type) {
print("button click title $title");
},
onUrlClicked:// Optional: Add this function callback as a url click listener
(String? url) {
print("url clicked $url");
},
child:constFloatingActionButton(
onPressed:null,
child:Icon(Icons.chat),
),
);
}
returnconstText("Loading...");
},
),
),
);
}

Button click listeners

These button are defined as a part of the conversational flow. Once the user clicks the button, you can listen to the events in your flutter app. A very common use case for this is navigating the user to another section of the app if button is clicked inside the recipe. Note: Button which contains url would be treated as button instead of the url. Hence, you'll get callback on onButtonClicked if implemented

VerloopWidget(
clientId:<client_id>, // Required
onButtonClicked:
(String? title, String? payload, String? type) {
print("button click title $title");
},
child:<SomeWidget>,
);

Url click listeners

These urls are defined as a part of the conversational flow. Once the user clicks the url, you can listen to the events in your flutter app.

You can choose whether to open the url in mobile browser or handle it in the app by setting overrideUrlOnClick field. If overrideUrlOnClick is true, we will not open the url anywhere but you'll get a callback on onUrlClicked function.

VerloopWidget(
clientId:<client_id>, // Required
overrideUrlOnClick:false
onUrlClicked:
(String? url) {
print("url clicked $url");
},
child:<SomeWidget>,
);

Handling notifications

follow this https://firebase.google.com/docs/flutter/setup

Once the fcm is setup, just send the fcmToken as a part of VerloopWidget.

NOTE: make sure the server key is added to the verloop's setting page for the same firebase app which is configured in your flutter app.

To Navigate to the verloop's setting page

  • open https://client_id.verloop.io
  • go to settings gear icon on the left navigation panel
  • search for android sdk
  • add the server key as production
  • similarly, go to ios sdk
  • add appropiate files as production configuration

About

This is a wrapper sdk for Flutter over android, ios and web

Resources

Stars

1 star

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

This is a wrapper over native verloop's iOS and Android SDK.

You can checkout sample app for any clarification on the usage of the SDK

Getting Started

Here we are adding verloop chat button as a floating action button in the app. You can attach the widget at any other place too

On press is internally handled by the VerloopWidget using onTap of GestureDetector widget

constString _clientId ="ClientID"; // You need to use the name of your organisation herefinalMap<String,String> userVariableMap =Map();
userVariableMap['key1'] ='value1';
finalMap<String,String> roomVariableMap =Map();
roomVariableMap['key2'] ='value2';
Widgetbuild(BuildContext context) {
returnMaterialApp(
home:Scaffold(
appBar:AppBar(
backgroundColor:Colors.black,
title:constText('Plugin example app'),
),
body:Center(
child:Text('Running for client $clientId'),
),
floatingActionButton:FutureBuilder<String?>(
// Initialize FlutterFire
future:FirebaseMessaging.instance.getToken(),
builder: (context, snapshot) {
// Check for errorsif (snapshot.hasError) {
returnconstText("Something went wrong");
}
if (snapshot.hasData && snapshot.data !="") {
String token = snapshot.data ??"";
returnVerloopWidget(
clientId: _clientId, // Required
userId:"<user_id>", // Optional: add this if you want to associate all the chats of this user across the platforms 
recipeId:"<recipe_id>", // Optional: if you wish to use any other recipe apart from the default one, use this
fcmToken: token, // Optional: this would help us to send the notification on the device. You still need to handle the fcm notifications.
userName:"<user_name>", // Optional: This would populate the system variable for user name which would help you identify the user. else the name of the user would be autogenerated like "guest-123"
userEmail:"<user_email>", // Optional: This would populate the system variable for emails
userPhone:"<user_phone>", // Optional: This would populate the system variable for Phone number
userVariables: userVariableMap, // Optional: These are the global variables of the user which is associated with the given userId. These variables would be used by the recipe. These values would spill over to the another room once the current conversation is over.
roomVariables: roomVariableMap, // Optional: These variables would be used by the recipe and will not spill over another room created by the user once the conversation is over
overrideUrlOnClick:false, // Optional: this is by default false, if you don't want the url to open in the browser, and want to handle internally in the app, make it as false
onButtonClicked:// Optional: Add this function callback as a button click listener
(String? title, String? payload, String? type) {
print("button click title $title");
},
onUrlClicked:// Optional: Add this function callback as a url click listener
(String? url) {
print("url clicked $url");
},
child:constFloatingActionButton(
onPressed:null,
child:Icon(Icons.chat),
),
);
}
returnconstText("Loading...");
},
),
),
);
}

Button click listeners

These button are defined as a part of the conversational flow. Once the user clicks the button, you can listen to the events in your flutter app. A very common use case for this is navigating the user to another section of the app if button is clicked inside the recipe. Note: Button which contains url would be treated as button instead of the url. Hence, you'll get callback on onButtonClicked if implemented

VerloopWidget(
clientId:<client_id>, // Required
onButtonClicked:
(String? title, String? payload, String? type) {
print("button click title $title");
},
child:<SomeWidget>,
);

Url click listeners

These urls are defined as a part of the conversational flow. Once the user clicks the url, you can listen to the events in your flutter app.

You can choose whether to open the url in mobile browser or handle it in the app by setting overrideUrlOnClick field. If overrideUrlOnClick is true, we will not open the url anywhere but you'll get a callback on onUrlClicked function.

VerloopWidget(
clientId:<client_id>, // Required
overrideUrlOnClick:false
onUrlClicked:
(String? url) {
print("url clicked $url");
},
child:<SomeWidget>,
);

Handling notifications

follow this https://firebase.google.com/docs/flutter/setup

Once the fcm is setup, just send the fcmToken as a part of VerloopWidget.

NOTE: make sure the server key is added to the verloop's setting page for the same firebase app which is configured in your flutter app.

To Navigate to the verloop's setting page

  • open https://client_id.verloop.io
  • go to settings gear icon on the left navigation panel
  • search for android sdk
  • add the server key as production
  • similarly, go to ios sdk
  • add appropiate files as production configuration

About

This is a wrapper sdk for Flutter over android, ios and web

Resources

Stars

1 star

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

This is a wrapper over native verloop's iOS and Android SDK.

You can checkout sample app for any clarification on the usage of the SDK

Getting Started

Here we are adding verloop chat button as a floating action button in the app. You can attach the widget at any other place too

On press is internally handled by the VerloopWidget using onTap of GestureDetector widget

constString _clientId ="ClientID"; // You need to use the name of your organisation herefinalMap<String,String> userVariableMap =Map();
userVariableMap['key1'] ='value1';
finalMap<String,String> roomVariableMap =Map();
roomVariableMap['key2'] ='value2';
Widgetbuild(BuildContext context) {
returnMaterialApp(
home:Scaffold(
appBar:AppBar(
backgroundColor:Colors.black,
title:constText('Plugin example app'),
),
body:Center(
child:Text('Running for client $clientId'),
),
floatingActionButton:FutureBuilder<String?>(
// Initialize FlutterFire
future:FirebaseMessaging.instance.getToken(),
builder: (context, snapshot) {
// Check for errorsif (snapshot.hasError) {
returnconstText("Something went wrong");
}
if (snapshot.hasData && snapshot.data !="") {
String token = snapshot.data ??"";
returnVerloopWidget(
clientId: _clientId, // Required
userId:"<user_id>", // Optional: add this if you want to associate all the chats of this user across the platforms 
recipeId:"<recipe_id>", // Optional: if you wish to use any other recipe apart from the default one, use this
fcmToken: token, // Optional: this would help us to send the notification on the device. You still need to handle the fcm notifications.
userName:"<user_name>", // Optional: This would populate the system variable for user name which would help you identify the user. else the name of the user would be autogenerated like "guest-123"
userEmail:"<user_email>", // Optional: This would populate the system variable for emails
userPhone:"<user_phone>", // Optional: This would populate the system variable for Phone number
userVariables: userVariableMap, // Optional: These are the global variables of the user which is associated with the given userId. These variables would be used by the recipe. These values would spill over to the another room once the current conversation is over.
roomVariables: roomVariableMap, // Optional: These variables would be used by the recipe and will not spill over another room created by the user once the conversation is over
overrideUrlOnClick:false, // Optional: this is by default false, if you don't want the url to open in the browser, and want to handle internally in the app, make it as false
onButtonClicked:// Optional: Add this function callback as a button click listener
(String? title, String? payload, String? type) {
print("button click title $title");
},
onUrlClicked:// Optional: Add this function callback as a url click listener
(String? url) {
print("url clicked $url");
},
child:constFloatingActionButton(
onPressed:null,
child:Icon(Icons.chat),
),
);
}
returnconstText("Loading...");
},
),
),
);
}

Button click listeners

These button are defined as a part of the conversational flow. Once the user clicks the button, you can listen to the events in your flutter app. A very common use case for this is navigating the user to another section of the app if button is clicked inside the recipe. Note: Button which contains url would be treated as button instead of the url. Hence, you'll get callback on onButtonClicked if implemented

VerloopWidget(
clientId:<client_id>, // Required
onButtonClicked:
(String? title, String? payload, String? type) {
print("button click title $title");
},
child:<SomeWidget>,
);

Url click listeners

These urls are defined as a part of the conversational flow. Once the user clicks the url, you can listen to the events in your flutter app.

You can choose whether to open the url in mobile browser or handle it in the app by setting overrideUrlOnClick field. If overrideUrlOnClick is true, we will not open the url anywhere but you'll get a callback on onUrlClicked function.

VerloopWidget(
clientId:<client_id>, // Required
overrideUrlOnClick:false
onUrlClicked:
(String? url) {
print("url clicked $url");
},
child:<SomeWidget>,
);

Handling notifications

follow this https://firebase.google.com/docs/flutter/setup

Once the fcm is setup, just send the fcmToken as a part of VerloopWidget.

NOTE: make sure the server key is added to the verloop's setting page for the same firebase app which is configured in your flutter app.

To Navigate to the verloop's setting page

  • open https://client_id.verloop.io
  • go to settings gear icon on the left navigation panel
  • search for android sdk
  • add the server key as production
  • similarly, go to ios sdk
  • add appropiate files as production configuration

About

This is a wrapper sdk for Flutter over android, ios and web

Resources

Stars

1 star

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

This is a wrapper over native verloop's iOS and Android SDK.

You can checkout sample app for any clarification on the usage of the SDK

Getting Started

Here we are adding verloop chat button as a floating action button in the app. You can attach the widget at any other place too

On press is internally handled by the VerloopWidget using onTap of GestureDetector widget

constString _clientId ="ClientID"; // You need to use the name of your organisation herefinalMap<String,String> userVariableMap =Map();
userVariableMap['key1'] ='value1';
finalMap<String,String> roomVariableMap =Map();
roomVariableMap['key2'] ='value2';
Widgetbuild(BuildContext context) {
returnMaterialApp(
home:Scaffold(
appBar:AppBar(
backgroundColor:Colors.black,
title:constText('Plugin example app'),
),
body:Center(
child:Text('Running for client $clientId'),
),
floatingActionButton:FutureBuilder<String?>(
// Initialize FlutterFire
future:FirebaseMessaging.instance.getToken(),
builder: (context, snapshot) {
// Check for errorsif (snapshot.hasError) {
returnconstText("Something went wrong");
}
if (snapshot.hasData && snapshot.data !="") {
String token = snapshot.data ??"";
returnVerloopWidget(
clientId: _clientId, // Required
userId:"<user_id>", // Optional: add this if you want to associate all the chats of this user across the platforms 
recipeId:"<recipe_id>", // Optional: if you wish to use any other recipe apart from the default one, use this
fcmToken: token, // Optional: this would help us to send the notification on the device. You still need to handle the fcm notifications.
userName:"<user_name>", // Optional: This would populate the system variable for user name which would help you identify the user. else the name of the user would be autogenerated like "guest-123"
userEmail:"<user_email>", // Optional: This would populate the system variable for emails
userPhone:"<user_phone>", // Optional: This would populate the system variable for Phone number
userVariables: userVariableMap, // Optional: These are the global variables of the user which is associated with the given userId. These variables would be used by the recipe. These values would spill over to the another room once the current conversation is over.
roomVariables: roomVariableMap, // Optional: These variables would be used by the recipe and will not spill over another room created by the user once the conversation is over
overrideUrlOnClick:false, // Optional: this is by default false, if you don't want the url to open in the browser, and want to handle internally in the app, make it as false
onButtonClicked:// Optional: Add this function callback as a button click listener
(String? title, String? payload, String? type) {
print("button click title $title");
},
onUrlClicked:// Optional: Add this function callback as a url click listener
(String? url) {
print("url clicked $url");
},
child:constFloatingActionButton(
onPressed:null,
child:Icon(Icons.chat),
),
);
}
returnconstText("Loading...");
},
),
),
);
}

Button click listeners

These button are defined as a part of the conversational flow. Once the user clicks the button, you can listen to the events in your flutter app. A very common use case for this is navigating the user to another section of the app if button is clicked inside the recipe. Note: Button which contains url would be treated as button instead of the url. Hence, you'll get callback on onButtonClicked if implemented

VerloopWidget(
clientId:<client_id>, // Required
onButtonClicked:
(String? title, String? payload, String? type) {
print("button click title $title");
},
child:<SomeWidget>,
);

Url click listeners

These urls are defined as a part of the conversational flow. Once the user clicks the url, you can listen to the events in your flutter app.

You can choose whether to open the url in mobile browser or handle it in the app by setting overrideUrlOnClick field. If overrideUrlOnClick is true, we will not open the url anywhere but you'll get a callback on onUrlClicked function.

VerloopWidget(
clientId:<client_id>, // Required
overrideUrlOnClick:false
onUrlClicked:
(String? url) {
print("url clicked $url");
},
child:<SomeWidget>,
);

Handling notifications

follow this https://firebase.google.com/docs/flutter/setup

Once the fcm is setup, just send the fcmToken as a part of VerloopWidget.

NOTE: make sure the server key is added to the verloop's setting page for the same firebase app which is configured in your flutter app.

To Navigate to the verloop's setting page

  • open https://client_id.verloop.io
  • go to settings gear icon on the left navigation panel
  • search for android sdk
  • add the server key as production
  • similarly, go to ios sdk
  • add appropiate files as production configuration

About

This is a wrapper sdk for Flutter over android, ios and web

Resources

Stars

1 star

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages