On Fri, Sep 6, 2019 at 4:45 PM Dushan Silva <dush...@wso2.com> wrote:

> Hi Kasun,
>
>
>>    - We already have a query string parser/formatter library *qs
>>    
>> <https://github.com/dushansilva/carbon-apimgt/blob/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/package.json#L42>
>>  *shall
>>    we use that library in here[1
>>    
>> <https://github.com/dushansilva/carbon-apimgt/blob/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/source/src/app/CustomRouter/BrowserRouter.jsx#L52>
>>    ][2
>>    
>> <https://github.com/dushansilva/carbon-apimgt/blob/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/source/src/app/CustomRouter/BrowserRouter.jsx#L56>]
>>    too ? is there any limitations with that library ?
>>
>> no limitation, since query-string was already available in our package I
> used it, we can use qs too. I think both can be used here.
>
There is a minor advantage of using query-string instead of qs where we can
parse the location.search prop directly into query string without removing
the ?
*const parsed = queryString.parse(location.search);*

But for qs we either have to replace the ? with ' '   like we have done in
[1] or specifically mention to ignore the ? like *var prefixed =
qs.parse('?a=b&c=d', { ignoreQueryPrefix: true });*

[1]
https://github.com/wso2/carbon-apimgt/blob/master/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/source/src/app/ProtectedApp.jsx#L152

Thanks,
Tanya

>
> Shall we move the BrowserRouter.jsx file to
>> */store-new/source/src/app/components/Base/* directory, Since this file
>> is a React component, it should come under components directory and there
>> we could move it to Base components directory?
>
> Shall we add the props validation in the original BrowserRouter
>> <https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/modules/BrowserRouter.js#L19-L25>[4]
>> implementation?
>
>
> +1, Will do that
>
>
>
> On Fri, Sep 6, 2019 at 11:16 AM Kasun Thennakoon <kasu...@wso2.com> wrote:
>
>> Hi Dushan,
>>
>> First, great work on implementing the multi-tenancy support  to Store
>> SPA, This improvement will allow users to directly access a tenant
>> store,share tenant store URL etc.
>> I have a few suggestions on the implementation.
>>
>>    - We already have a query string parser/formatter library *qs
>>    
>> <https://github.com/dushansilva/carbon-apimgt/blob/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/package.json#L42>
>>  *shall
>>    we use that library in here[1
>>    
>> <https://github.com/dushansilva/carbon-apimgt/blob/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/source/src/app/CustomRouter/BrowserRouter.jsx#L52>
>>    ][2
>>    
>> <https://github.com/dushansilva/carbon-apimgt/blob/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/source/src/app/CustomRouter/BrowserRouter.jsx#L56>]
>>    too ? is there any limitations with that library ?
>>    - Shall we move the BrowserRouter.jsx file to
>>    */store-new/source/src/app/components/Base/* directory, Since this
>>    file is a React component, it should come under components directory and
>>    there we could move it to Base components directory?
>>    - Shall we add the props validation in the original BrowserRouter
>>    
>> <https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/modules/BrowserRouter.js#L19-L25>[4]
>>    implementation?
>>    - And also I think we now need to keep an eye on the original
>>    (react-router-dom) BrowserRouter.js
>>    
>> <https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/modules/BrowserRouter.js#L19-L25>
>>  implementation,
>>    To absorb their changes to our component.
>>
>>
>> [1]:
>> https://github.com/dushansilva/carbon-apimgt/blob/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/source/src/app/CustomRouter/BrowserRouter.jsx#L52
>> [2]:
>> https://github.com/dushansilva/carbon-apimgt/blob/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/source/src/app/CustomRouter/BrowserRouter.jsx#L56
>> [3]:
>> https://github.com/dushansilva/carbon-apimgt/tree/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/source/src/app/components/Base
>> [4]:
>> https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/modules/BrowserRouter.js#L19-L25
>>
>> Thanks
>> ~KasunTe
>>
>> On Thu, Sep 5, 2019 at 3:29 PM Dushan Silva <dush...@wso2.com> wrote:
>>
>>> Hi all,
>>> I have been working on $Subject. While working on it we came across the
>>> following requirement.
>>>
>>> In the previous store implementation the tenant domain is passed on the
>>> url as a query param and when either the page is refresh or if the url is
>>> directly accessed with the query param tenant specific details are loaded.
>>> However in the current react based single page implementation all the
>>> routing is handle via react router. Here if we initially plan on keeping
>>> the tenant domain in the react context api as a global setting. Once the
>>> app is loaded routing can be handled easily by taking the tenant domain
>>> from the context api.
>>>
>>> The problem is when the app is refreshed or if a url is visited
>>> directly, at this occasion the context api is empty and the user will
>>> always be redirect to the tenant listing. To handle this issue after
>>> considering some input from the react community [1] , we came up with the
>>> solution of writing an interceptor for the react router. This would require
>>> us to extend the currently react router implementation and its history
>>> implementation to plugin our custom interceptor. An advantage of the
>>> interceptor approach is that this saves the developer the hassle handling
>>> both tenant and normal cases each and every route path already added and
>>> paths to be added in the future. The flow will be as follows.
>>>
>>> When the store is initially loaded react router should be initialized
>>> [2]. Rather than using the default Router component by react router we will
>>> be using our custom component BrowserRouter [3]. In this we place the
>>> interceptor to be invoked when we are navigating around (push or replace)
>>> [4]. The interceptor [5] will take the tenant domain from the context and
>>> append it to the path. So in each route (when the user navigates to
>>> different pages this will be appended as a query param.
>>>
>>> To retrieve the tenant specific data from the REST API , we will be
>>> getting the tenant domain from the query param and setting it to the
>>> x-wso2-tenant header [6].
>>>
>>> Any thoughts and feedback on this much appreciated.
>>>
>>>
>>> [1] -
>>> https://stackoverflow.com/questions/57757263/how-to-write-an-interceptor-for-react-router/57757921#57757921
>>> [2] -
>>> https://github.com/dushansilva/carbon-apimgt/blob/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/source/src/App.jsx#L96
>>> [3] -
>>> https://github.com/dushansilva/carbon-apimgt/blob/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/source/src/app/CustomRouter/BrowserRouter.jsx#L15
>>> [4] -
>>> https://github.com/dushansilva/carbon-apimgt/blob/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/source/src/app/CustomRouter/BrowserRouter.jsx#L28
>>> [5] -
>>> https://github.com/dushansilva/carbon-apimgt/blob/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/source/src/app/CustomRouter/BrowserRouter.jsx#L43
>>> [6] -
>>> https://github.com/dushansilva/carbon-apimgt/blob/5603333b774c10b74c2709c6bf5b9c6ac20ccca6/features/apimgt/org.wso2.carbon.apimgt.store.feature/src/main/resources/store-new/source/src/app/data/APIClient.jsx#L163
>>> --
>>> Best Regards
>>> Dushan Silva
>>> Software Engineer
>>>
>>> *WSO2, Inc. *
>>>
>>> lean . enterprise . middleware
>>> Mob: +94 774 979042
>>>
>>
>>
>> --
>> *Kasun Thennakoon* | Senior Software Engineer | WSO2 Inc.
>> (m) +94 711661919 | (w) +94 11 214 5345 | (e) kasu...@wso2.com
>> GET INTEGRATION AGILE
>> Integration Agility for Digitally Driven Business
>>
>
>
> --
> Best Regards
> Dushan Silva
> Software Engineer
>
> *WSO2, Inc. *
>
> lean . enterprise . middleware
> Mob: +94 774 979042
> _______________________________________________
> Architecture mailing list
> Architecture@wso2.org
> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture
>


-- 
*Tanya Madurapperuma* | Technical Lead | WSO2 Inc.
(m) +94718184439 | (e) ta...@wso2.com

<http://wso2.com/signature>
_______________________________________________
Architecture mailing list
Architecture@wso2.org
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture

Reply via email to